我正在使用Python 2.7中的正则表达式RE模块进行试验。文档说明在re.sub()函数中count参数是可选的。如果它丢失或设置为0,则所有匹配将被替换。但事实并非如此。特别注意当're.I'或're.M'存在但缺少组参数时处理的差异:
Python 2.7.9 (default, Mar 1 2015, 12:57:24)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> a = "The brown fox over the little doggy which moved."
>>> b = re.sub(r'o\w','au',a)
>>> print b
The braun fau auer the little daugy which maued.
>>> b = re.sub(r'o\w','au',a,2)
>>> print b
The braun fau over the little doggy which moved.
>>> b = re.sub(r'o\w','au',a,re.I)
>>> print b
The braun fau over the little doggy which moved.
>>> b = re.sub(r'o\w','au',a,flags=re.I)
>>> print b
The braun fau auer the little daugy which maued.
>>> b = re.sub(r'o\w','au',a,re.M)
>>> print b
The braun fau auer the little daugy which maued.
这通常是Python中的预期行为吗?如果是这样,那是不是意味着代码不可靠?
答案 0 :(得分:3)
请注意re.sub
的声明:
re.sub(pattern, repl, string, count=0, flags=0)
第一个可选参数是count
,然后是flag
。 re.M
和re.I
都是整数(分别为8
和2
),因此,如果您致电re.sub(r'o\w','au',a,re.I)
,则re.I
会被解释作为count=2
,不作为flag
。
由于这些只是整数,并且在传递给函数之前进行了评估,因此Python解释器无法将它们与“常规”整数区分开来。对于口译员,re.sub(r'o\w','au',a,re.I)
与re.sub(r'o\w','au',a,2)
无法区分。
另一方面,如果您执行re.sub(r'o\w','au',a,flags=re.I)
,则明确将其作为flag
参数传递,并使count
保留默认值。