Python re模块findall匹配成功但sub替换无效问题咨询
问题原因
- 你使用的正则
(?=(Deportivo))(?!.*\bla\b)全部由零宽断言组成,本身不匹配任何实际字符,仅匹配符合条件的空白位置。 re.findall返回['Deportivo']是因为你在正向肯定预查中写了捕获组,re.findall遇到捕获组时会优先返回捕获组内的内容,这并不代表正则实际匹配到了Deportivo字符串本身。- 执行
re.sub时,只是把匹配到的空白位置替换为空,不会修改原字符串中的实际字符,因此返回结果和原字符串一致。
解决方法
直接将需要删除的Deportivo放到正则的实际匹配区域,先通过负向预查判断整个字符串不存在独立单词la,再匹配Deportivo做替换即可,正确写法如下:
import re # 正则说明:先判断整个字符串不存在独立单词la,再匹配Deportivo及后面可选的空格 print(re.sub(r'(?!.*\bla\b)Deportivo\s?', '', 'Deportivo coruna')) # 输出:coruna print(re.sub(r'(?!.*\bla\b)Deportivo\s?', '', 'Deportivo la coruna')) # 输出:Deportivo la coruna
如果你的字符串包含换行符,可以在正则开头加(?s)修饰符,让.可以匹配换行符:r'(?s)(?!.*\bla\b)Deportivo\s?'
内容的提问来源于stack exchange,提问作者mold
相关产品推荐
相关产品推荐

