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

如何使用Python的re.sub函数多次移除字符串中'but'与'ball'之间的子串并得到正确结果

解决正则匹配过度的问题

这个问题是正则表达式里经典的贪婪匹配 vs 非贪婪匹配的坑!我们来一步步拆解:

问题原因

你原来用的正则but.*ball里,.*是贪婪模式——它会尽可能匹配最长的符合条件的字符串。在你的原字符串中,第一个but会直接匹配到最后一个ball,把中间的I don't like football; I like sport, but I don't like整个都包含进去了,所以替换后就只剩下最开头的I like sport, 。

解决方案

把贪婪匹配改成非贪婪匹配,只需要把.*改成.*?即可。.*?会尽可能匹配最短的符合条件的字符串,也就是每个but只匹配到它后面最近的ball。

修改后的代码如下:

import re

s = 'I like sport, but I don\'t like football; I like sport, but I don\'t like basketball'
result = re.sub('but.*?ball', '', s)
print(result)  # 输出: I like sport, I like sport

另外补充一点:你原来加的flags=re.MULTILINE在这里其实没有作用,因为这个flag只影响^和$锚点的匹配范围(从行首/行尾变成整个字符串的首尾),而你的正则里没有用到这些锚点,所以可以去掉这个参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:37:35