You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何改进正则表达式,排除传真号码提取指定区间文本?

问题:提取Fax(排除号码)与Total Profit之间的目标文本

先看你给出的示例内容:

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(排除其后的传真号码)与Total Profit之间的准确文本。传真号码格式不固定,但Fax字符串必然存在。当前你用的正则:

re.findall(r'Fax\s((?:(?!Fax).)*?)Total', content , re.DOTALL|re.M)

会把传真号码也包含在结果里,而你想要的预期输出是:

['XI54545454 ZI41 8263 8815 1100\n+2939 218932 000\n']

并且希望用通用正则方案,避免手动分割文本。


解决方案:改进正则跳过传真号码行

直接用这个正则就能实现需求:

import re

result = re.findall(r'Fax\s+\S.*?\n((?:(?!Fax|Total).)*?)Total', content, re.DOTALL)
print(result)

正则各部分作用拆解:

  • Fax\s+\S.*?\n:专门用来匹配并跳过传真号码所在行:
    • Fax:精准匹配关键词
    • \s+:匹配Fax和号码之间的一个或多个空白字符
    • \S:匹配传真号码的第一个非空白字符,确保我们从号码内容开始匹配
    • .*?\n:非贪婪匹配到换行符,把整个传真号码行完全跳过
  • ((?:(?!Fax|Total).)*?):这是我们要捕获的目标内容:
    • (?!Fax|Total):负前瞻断言,确保匹配过程中不会碰到Fax或Total,避免误匹配前面的无效内容
    • .*?:非贪婪匹配所有字符,配合re.DOTALL让.能识别换行符
  • Total:匹配结束的关键词,确保我们停在Total Profit的开头

这个方案不管传真号码格式怎么变,只要它跟在Fax后面的同一行,就能被正确跳过,完全符合你的通用提取需求。

内容的提问来源于stack exchange,提问作者Laxmikant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:38:24