我有类似的查询,只是模式中有一些可选的数字(传真号码(。
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'Faxs((?:(?!Fax).)*?)Total', content , re.DOTALL|re.M)
['+07023400800 1234nXI54545454 ZI41 8263 8815 1100n+2939 218932 000n']
如何通过改进正则表达式模式来摆脱传真号码的使用。
预期成果:
['XI54545454 ZI41 8263 8815 1100n+2939 218932 000n']
我不想使用手动文本处理,例如 [result[0].split(''([1:]],因为这是我的通用方法。
我自己尝试了一些模式,但没有运气。
我建议匹配Fax
行上第一个单词的文本,然后匹配它后面的整行而不捕获,然后捕获任何不以Fax
或Total
开头的行,直到以Total
开头的行:
re.findall(r'(?m)^Faxb.*((?:[rn](?!Total|Fax).*)+)[rn]Total', s)
请参阅正则表达式演示。您可能必须从中去除空格,但它比^Fax[^nr]*[rn]+((?:(?!Fax).)*?)[rn]Total
更有效、更精确,因为这将阻止以Fax
和Total
开头的行之间的任何位置与Fax
匹配。
详
(?m)
-re.MULTILINE
内联修饰符^
- 行的起点Faxb
- 一个完整的单词Fax
.*
- 行的其余
部分((?:[rn](?!Total|Fax).*)+)
- 捕获组 1:一个或多个重复[rn]
- CR 或 LF 符号(?!Total|Fax)
- 不跟Total
或Fax
(替换为(?!(?:Total|Fax)b)
以仅将它们作为整个单词匹配(.*
- 行的其余
部分
[rn]
- CR 或 LFTotal
- 单词Total
(添加b
以需要整个单词,Totalb
(
尝试以下操作:-
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'Faxs[+0-9s]+((?:(?!Fax).)*?)Total', content , re.DOTALL|re.M)
在这里,我们将传真的正则表达式更新为 [+0-9\s],以便它将考虑数字中任何空格的"+"、"0-9"数字和 \s。希望这会有所帮助。