Python(RE模块)可选参数处理是否不一致?

时间:2015-09-10 07:37:00

标签: python regex optional-parameters

我正在使用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中的预期行为吗?如果是这样,那是不是意味着代码不可靠?

1 个答案:

答案 0 :(得分:3)

请注意re.sub的声明:

re.sub(pattern, repl, string, count=0, flags=0)

第一个可选参数是count,然后是flagre.Mre.I都是整数(分别为82),因此,如果您致电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保留默认值。