Python正则表达式未返回预期结果:如何调整正则规则?
问题分析与解决
原代码问题原因
- 正则中的
.未转义:.在正则里是匹配任意字符的通配符,原代码前瞻里的. Withey Limited实际是匹配任意字符加空格Withey Limited,完全偏离了匹配字面句号的需求。 - 贪婪匹配+错误的字符集:原正则用了贪婪的
+匹配,且字符集包含.,导致会把It was formerly known as后面的内容一直匹配到最远的前瞻位置(也就是. It),连本该保留的. Withey Limited也被包含进匹配范围,替换后只剩后面的. It...。 - 前瞻未做优先匹配:原代码把两个停止条件放在同一个前瞻里,贪婪模式下会选择最远的匹配项,无法实现优先在
. Withey Limited停止的需求。
修正后的代码
使用非贪婪匹配+分支优先的正则,就能得到预期结果:
import re txt = 'It was formerly known as A. Withey & Black Limited. Withey Limited delivers many things. It has a facility in the UK, including many branches.' # 方案1:用前瞻定位停止点,替换掉前面的内容 out = re.sub(r'\s*It was formerly known as .*?(?=\. Withey Limited|\. It)', '', txt) # 方案2:捕获停止点内容,替换为捕获组(效果一致) # out = re.sub(r'\s*It was formerly known as .*?(\. Withey Limited|\. It)', r'\1', txt) print(out)
修正说明
- 非贪婪匹配
.*?:确保匹配到第一个符合条件的停止点就停止,不会过度匹配。 - 转义句号
\.:明确匹配字面的句号,避免通配符干扰。 - 分支顺序优先:把
\. Withey Limited放在分支前面,正则会优先匹配这个停止点,只有当不存在时才匹配\. It,符合需求。
运行后输出:
Withey Limited delivers many things. It has a facility in the UK, including many branches.
内容的提问来源于stack exchange,提问作者Eghbal
相关产品推荐
相关产品推荐

