正则表达式问题:re.I修饰符未生效,无法忽略大小写移除指定单词
问题分析与解决
哦,这个坑我之前也踩过!你遇到的问题是re.sub的参数顺序搞错了,导致re.I(大小写不敏感)修饰符根本没生效。
问题根源
先看re.sub的官方参数定义:
re.sub(pattern, repl, string, count=0, flags=0)
第四个参数是count(指定替换次数,默认0表示全部替换),第五个才是flags(正则标志位)。你原代码里把re.I放在第四个位置,Python会把它当成count=1来处理——意思是只替换1次匹配项,完全没启用大小写不敏感的规则!这就是为什么只有小写开头的affirmed、affirmance被替换,而AFFIRMED、Affirm没被处理。
修正方案
只需要把re.I放到正确的位置,或者更稳妥的是用关键字参数flags=re.I,这样就不会搞混顺序了:
修正后的代码
import re txt='affirmed and the affirmance and AFFIRMED and Affirm case' wordList = ['affirm\w+', '(ca\w+)'] for word in wordList: # 用关键字参数指定flags,清晰不易错 txt = re.sub(word, '', txt, flags=re.I) print(txt)
输出结果
and the and and
(注:因为第二个正则ca\w+匹配了case,所以case也被移除了,如果不需要移除它可以从wordList里删掉)
额外小建议
- 当不需要指定
count时,优先用关键字参数flags=xxx,避免参数顺序混淆; - 如果确实需要指定替换次数,比如只替换2次,可以这么写:
txt = re.sub(word, '', txt, count=2, flags=re.I)
内容的提问来源于stack exchange,提问作者John Taylor
相关产品推荐
相关产品推荐

