如何改进正则表达式,排除传真号码提取指定区间文本?
问题:提取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
相关产品推荐
相关产品推荐

