代码之家  ›  专栏  ›  技术社区  ›  Laxmikant

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

  •  1
  • Laxmikant  · 技术社区  · 7 年前

    我有 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 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    7 年前

    我建议在后面匹配文本 Fax 这是一行中的第一个单词,然后在不捕获的情况下匹配它后面的整行,然后捕获任何不以开头的行 传真 Total 直到开始的那一行 总数 :

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

    查看 regex demo 。您可能需要从中去除空白,但它比 ^Fax[^\n\r]*[\r\n]+((?:(?!Fax).)*?)[\r\n]Total 因为这个会阻止匹配 传真 在任何地方 从开始的行之间 传真 总数 .

    细节

    • (?m) - re.MULTILINE 内联修饰符
    • ^ -行首
    • Fax\b -一个完整的词 传真
    • .* -剩下的部分
    • ((?:[\r\n](?!Total|Fax).*)+) -捕捉组1:一次或多次重复
      • [\r\n] -CR或LF符号
      • (?!Total|Fax) -后面没有 总数 传真 (替换为 (?!(?:Total|Fax)\b) 只将它们作为整个单词匹配)
      • * -剩下的部分
    • [\r\n] -CR或LF
    • 合计 -这个词 合计 (添加) \b 需要一个完整的词, Total\b )
        2
  •  0
  •   nandal    7 年前

    尝试以下操作:

    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)
    

    在这里,我们更新了regex for fax with[+0-9\s],以便它将考虑“+”,“0-9”数字和\s中的任何空格。希望这会有所帮助。