我有similar query,但模式中有一些可选数字(传真号码)。
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:]]等手动文本处理,因为这是我的通用方法。
我自己尝试了一些模式,但没有运气。
答案 0 :(得分:1)
我建议将Fax
后面的文字与行上的第一个单词匹配,然后匹配整行后的文本而不捕获,然后捕获任何不以Fax
或{{开头的行1}}以及以Total
开头的行:
Total
请参阅regex demo。您可能需要从中删除空格,但它比re.findall(r'(?m)^Fax\b.*((?:[\r\n](?!Total|Fax).*)+)[\r\n]Total', s)
更高效,更精确,因为这会阻止与^Fax[^\n\r]*[\r\n]+((?:(?!Fax).)*?)[\r\n]Total
之间的行匹配1}}和Fax
。
<强>详情
Fax
- Total
内联修饰符(?m)
- 行的开头re.MULTILINE
- 整个字^
Fax\b
- 其余部分Fax
- 捕获第1组:重复一次或多次
.*
- CR或LF符号((?:[\r\n](?!Total|Fax).*)+)
- 没有跟[\r\n]
或(?!Total|Fax)
一起使用(替换为Total
只能将它们作为整个单词匹配)Fax
- 其余部分(?!(?:Total|Fax)\b)
- CR或LF .*
- 单词[\r\n]
(添加Total
需要一个完整的单词,Total
)答案 1 :(得分:0)
请尝试以下方法: -
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-9 \ s]更新了传真的正则表达式,因此对于数字中的任何空格,它将考虑'+','0-9'数字和\ s。希望这会有所帮助。