使用可选字符串查找最接近的文本

时间:2018-05-28 11:30:47

标签: python regex

我有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:]]等手动文本处理,因为这是我的通用方法。

我自己尝试了一些模式,但没有运气。

2 个答案:

答案 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。希望这会有所帮助。