如何使用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
相关产品推荐
相关产品推荐

