正则表达式替换异常:无法正确排除带特定后缀的ABC字符串
正则表达式替换异常:无法正确排除带特定后缀的ABC字符串
看起来你这是正则的逻辑和语法都踩了小坑,导致不该替换的ABC也被误替换了,我来帮你捋清楚问题,再给你搞定它~
首先说说你原来的正则为啥不对:
- 你用
|把两个否定前瞻分开写,这会让逻辑变成「只要ABC不满足其中一个排除条件,就会被匹配替换」,而不是你想要的「同时不满足两个排除条件才替换」。比如ABC.png,它确实不满足「后面是 thumb.png」这个条件,所以会被第二个规则命中,自然就被替换成bueno.png了。 - 还有个小细节:你正则里的
.没转义,在正则语法里.代表任意字符,不是字面量的点号,这也会让你的匹配判断出现偏差。
那怎么改才对呢?我们要把两个排除条件合并到同一个否定前瞻里,同时转义点号,这样就能精准命中需要替换的ABC了。
修改后的代码是这样的:
import re texto = "ABC ABC. ABC.png ABC thumb.png" # 匹配ABC,且后面既不是 .png 也不是 thumb.png regex = r"ABC(?!(?:\.png|\ thumb\.png))" novo = re.sub(regex, "bueno", texto) print(novo)
运行这段代码后,输出就完全符合你的预期了:
bueno bueno. ABC.png ABC thumb.png
再给你拆解下这个正则的逻辑:
(?:\.png|\ thumb\.png)是个非捕获组,把我们要排除的两种情况包在一起:一种是ABC后面直接跟.png,另一种是ABC后面跟thumb.png(?!...)是否定前瞻,意思就是「当前位置后面绝对不能匹配括号里的任意一种情况」,这样一来,只有那些不在排除列表里的ABC才会被替换掉。
要是之后你还要加其他类似的排除后缀,直接在非捕获组里用|追加就行,比如想排除.jpg的话,就改成(?:\.png|\ thumb\.png|\.jpg)。
备注:内容来源于stack exchange,提问作者Ashe
相关产品推荐
相关产品推荐

