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



我有类似的查询,只是模式中有一些可选的数字(传真号码(。

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行上第一个单词的文本,然后匹配它后面的整行而不捕获,然后捕获任何不以FaxTotal开头的行,直到以Total开头的行:

re.findall(r'(?m)^Faxb.*((?:[rn](?!Total|Fax).*)+)[rn]Total', s)

请参阅正则表达式演示。您可能必须从中去除空格,但它比^Fax[^nr]*[rn]+((?:(?!Fax).)*?)[rn]Total更有效、更精确,因为这将阻止以FaxTotal开头的行之间的任何位置Fax匹配。

  • (?m)-re.MULTILINE内联修饰符
  • ^- 行的起点
  • Faxb- 一个完整的单词Fax
  • .*- 行的其余
  • 部分
  • ((?:[rn](?!Total|Fax).*)+)- 捕获组 1:一个或多个重复
    • [rn]- CR 或 LF 符号
    • (?!Total|Fax)- 不跟TotalFax(替换为(?!(?:Total|Fax)b)以仅将它们作为整个单词匹配(
    • .*- 行的其余
    • 部分
  • [rn]- CR 或 LF
  • Total- 单词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。希望这会有所帮助。

最新更新