Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用可选字符串查找最近的文本_Python_Regex - Fatal编程技术网

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
  • *
    -行的其余部分
  • ((?:[\r\n](?!Total | Fax.*)+)
    -捕获组1:一次或多次重复
    • [\r\n]
      -CR或LF符号
    • (?!Total | Fax)
      -后面不跟
      Total
      Fax
      (替换为
      (?!(?:Total | Fax)\b)
      以仅将它们作为整字匹配)
    • *
      -行的其余部分
  • [\r\n]
    -CR或LF
  • 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分钟内做到。。。!从过去几个小时以来,我一直在试图修复它。你是天才。请回答我会接受的。非常感谢:)