Python 使用可选字符串查找最近的文本
除了图案中有一些可选的数字(传真号码)外,我有Python 使用可选字符串查找最近的文本,python,regex,Python,Regex,除了图案中有一些可选的数字(传真号码)外,我有 content = """Generator London ABC / FI9 Phone +758 00 000000000 E-Mail london.abcd@gen.in Fax Generate order no 546465438 Generate order date 29.04.2018 Country of Use Page 1/ 3 Generator London ABC / FI9 Phone
content = """Generator London ABC / FI9
Phone +758 00 000000000
E-Mail london.abcd@gen.in
Fax
Generate order no 546465438
Generate order date 29.04.2018
Country of Use
Page 1/ 3
Generator London ABC / FI9
Phone +758 91 702 122222
E-Mail london.abcd@gen.in
Fax
Generate order no 4504967662
Generate order date 29.01.2018
Country of Use
Page 2/ 3
Payment terms:
30 days - 2 %, 45 days net
Supplier
Generator London ABC / 3I9
Phone +758 91 702 122222
E-Mail london.abcd@gen.in
Fax +07023400800 1234
XI54545454 ZI41 8263 8815 1100
+2939 218932 000
Total Profit Total Budget
...
"""
观察最后一次出现的传真,传真号码不一致,但Fax
字符串始终保持不变
我有数百个这种格式的文件,必须提取传真(传真号除外)和总利润之间的确切文本
$re.findall(r'Fax\s((?:(?!Fax).)*?)Total', content , re.DOTALL|re.M)
['+07023400800 1234\nXI54545454 ZI41 8263 8815 1100\n+2939 218932 000\n']
如何通过改进正则表达式模式来摆脱传真号码使用
预期结果:
['XI54545454 ZI41 8263 8815 1100\n+2939 218932 000\n']
我不想使用手动文本处理,例如[result[0].split('\n')[1:]],因为这是我的通用方法
我自己尝试了一些模式,但没有成功。我建议匹配
Fax
后的文本,这是一行中的第一个单词,然后匹配它后面的整行而不捕获,然后捕获任何不以Fax
或Total
开头的行,直到以Total
开头的行:
re.findall(r'(?m)^Fax\b.*((?:[\r\n](?!Total|Fax).*)+)[\r\n]Total', s)
看。您可能需要去掉其中的空白,但它比^Fax[^\n\r]*[\r\n]+((?:(?!Fax)。*)*?)[\r\n]Total
更有效、更精确,因为此选项将阻止以Fax
和Total
开头的行与Fax
匹配
详细信息
-有关多行的(?m)
内联修饰符
-行首^
-一个完整的单词Fax\b
Fax
-行的其余部分*
-捕获组1:一次或多次重复((?:[\r\n](?!Total | Fax.*)+)
-CR或LF符号[\r\n]
-后面不跟(?!Total | Fax)
或Total
(替换为Fax
以仅将它们作为整字匹配)(?!(?:Total | Fax)\b)
-行的其余部分*
-CR或LF[\r\n]
-单词Total
(添加Total
需要一个完整的单词,\b
)Total\b
import re
content = """Generator London ABC / FI9
Phone +758 00 000000000
E-Mail london.abcd@gen.in
Fax
Generate order no 546465438
Generate order date 29.04.2018
Country of Use
Page 1/ 3
Generator London ABC / FI9
Phone +758 91 702 122222
E-Mail london.abcd@gen.in
Fax
Generate order no 4504967662
Generate order date 29.01.2018
Country of Use
Page 2/ 3
Payment terms:
30 days - 2 %, 45 days net
Supplier
Generator London ABC / 3I9
Phone +758 91 702 122222
E-Mail london.abcd@gen.in
Fax +07023400800 1234
XI54545454 ZI41 8263 8815 1100
+2939 218932 000
Total Profit Total Budget
...
"""
print re.findall(r'Fax\s[\+0-9\s]+((?:(?!Fax).)*?)Total', content , re.DOTALL|re.M)
这里,我们用[+0~9s]来更新传真的正则表达式,因此它将考虑“+”、“0到9”的数字和数字中的任何空间。希望这会有所帮助
试试看。也许,更好的方法是不使用re.DOTALL
修饰符。@WiktorStribiżew-这太疯狂了,你怎么能在2分钟内做到。。。!从过去几个小时以来,我一直在试图修复它。你是天才。请回答我会接受的。非常感谢:)