Python 为什么';忽略案例标志(re.I)在re.sub()中工作

Python 为什么';忽略案例标志(re.I)在re.sub()中工作,python,regex,Python,Regex,从pydoc: re.sub=sub(模式,repl,字符串,计数=0,标志=0) 返回通过替换最左边的字符串获得的字符串 字符串中模式的非重叠引用由 替换回复。repl可以是字符串,也可以是可调用的; 如果是字符串,则处理其中的反斜杠转义。如果是 一个可调用函数,它传递了match对象,并且必须返回 要使用的替换字符串 示例代码: import re print re.sub('class', 'function', 'Class object', re.I) 除非我将模式更改为“类”,否则

从pydoc:

re.sub=sub(模式,repl,字符串,计数=0,标志=0)
返回通过替换最左边的字符串获得的字符串 字符串中模式的非重叠引用由 替换回复。repl可以是字符串,也可以是可调用的; 如果是字符串,则处理其中的反斜杠转义。如果是 一个可调用函数,它传递了match对象,并且必须返回 要使用的替换字符串

示例代码:

import re
print re.sub('class', 'function', 'Class object', re.I)
除非我将模式更改为“类”,否则不会进行替换

文档中没有提到这个限制,所以我认为我可能做错了什么


这里是什么情况?

在我看来,你应该做:

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

如果没有这个参数,
re.I
参数被传递到
count
参数。

flags
参数是第五个参数-您将
re.I
的值传递为
count
参数(这是一个容易犯的错误)。

对于那些仍然使用Python 2.6.x或更早版本安装的用户,请注意。说:

这意味着您不能将标志直接传递给sub。它们只能与compile一起使用:

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

只是为了补充Seppo的答案。根据,仍然有一种方法可以将标志直接传递给2.6中的“sub”,如果您必须使2.7代码与许多sub兼容,那么这种方法可能会很有用。引用手册:

。。。如果需要指定正则表达式标志,则必须使用RE对象,或在模式中使用嵌入的修饰符;例如,sub((?i)b+,“x”,“bbbbbbbb”)返回“x”

(?iLmsux)(集合“i”、“L”、“m”、“s”、“u”、“x”中的一个或多个字母)组匹配空字符串;这些字母为整个正则表达式设置了相应的标志:re.I(忽略大小写)、re.L(依赖于区域设置)、re.M(多行)、re.S(点匹配全部)、re.U(依赖于Unicode)和re.X(详细)。(标志在模块内容中描述。)如果希望将标志作为正则表达式的一部分包含,而不是将标志参数传递给re.compile()函数,则此选项非常有用

实际上,这意味着

print re.sub(“类”、“函数”、“类对象”,flags=re.I)

可以根据需要使用修饰符(?ms)重写


print re.sub(“(?i)class”、“function”、“class object”)

为避免此类错误,可以使用以下猴子补丁:

import re
re.sub = lambda pattern, repl, string, *, count=0, flags=0, _fun=re.sub: \
    _fun(pattern, repl, string, count=count, flags=flags)
*
禁止指定
计数
标志
作为位置参数。
\u fun=re.sub
使用声明时间
re.sub

演示:

$ python
Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.sub(r'\b or \b', ',', 'or x', re.X)
'or x'   # ?!
>>> re.sub = lambda pattern, repl, string, *, count=0, flags=0, _fun=re.sub: \
...     _fun(pattern, repl, string, count=count, flags=flags)
>>> re.sub(r'\b or \b', ',', 'or x', re.X)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes 3 positional arguments but 4 were given
>>> re.sub(r'\b or \b', ',', 'or x', flags=re.X)
', x'
>>> 
$python
Python 3.4.2(默认,2014年10月8日10:45:20)
[GCC 4.9.1]在linux上
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口稀土
>>>re.sub(r'\b或\b'、'、'或x',re.x)
“或x”?!
>>>re.sub=lambda模式,repl,string,*,count=0,flags=0,_-fun=re.sub:\
...     _乐趣(模式、复制、字符串、计数=计数、标志=标志)
>>>re.sub(r'\b或\b'、'、'或x',re.x)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:()接受3个位置参数,但给出了4个
>>>re.sub(r'\b或\b'、'、'或x',flags=re.x)
“,x”
>>> 

啊,你说得对。我错过了辩论要求。我习惯于在string对象之后放置标志,就像在main re中一样。函数,所以我没有太注意参数调用。谢谢
$ python
Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.sub(r'\b or \b', ',', 'or x', re.X)
'or x'   # ?!
>>> re.sub = lambda pattern, repl, string, *, count=0, flags=0, _fun=re.sub: \
...     _fun(pattern, repl, string, count=count, flags=flags)
>>> re.sub(r'\b or \b', ',', 'or x', re.X)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes 3 positional arguments but 4 were given
>>> re.sub(r'\b or \b', ',', 'or x', flags=re.X)
', x'
>>>