为什么ignorecase标志(re.I)在re.sub()中不生效?

65 投票
5 回答
42157 浏览
提问于 2025-04-17 09:58

来自pydoc的说明:

re.sub = sub(模式, 替换内容, 字符串, 计数=0, 标志=0)
这个函数会返回一个新字符串,它是通过把字符串中最左边的、不重叠的模式替换成替换内容得到的。替换内容可以是一个字符串,也可以是一个可调用的函数;如果是字符串,里面的反斜杠会被处理。如果是可调用的函数,它会接收一个匹配对象,并且必须返回一个用于替换的字符串。

示例代码:

import re
print re.sub('class', 'function', 'Class object', re.I)

如果我不把模式改成'Class',就不会进行任何替换。

文档里没有提到这个限制,所以我觉得我可能做错了什么。

这里到底是怎么回事呢?

5 个回答

4

给那些还在使用Python 2.6.x或更早版本的人一个提示。这是关于Python 2.6中正则表达式的文档,里面说:

re.sub(pattern, repl, string[, count])

re.compile(pattern[, flags])

这意味着你不能直接把标志传给sub函数。标志只能和compile函数一起使用:

regex = re.compile('class', re.I)
regex.sub("function", "Class object")
9

这里提到的 flags 参数是第五个参数 - 你把 re.I 的值当成了 count 参数传了进去(这是一个很容易犯的错误)。

112

在我看来,你应该这样做:

import re
print(re.sub('class', 'function', 'Class object', flags=re.I))

如果不这样做,re.I这个参数就会被传给count这个参数。

撰写回答