【问题标题】:Is Python (RE module) optional parameter handling inconsistent?Python(RE模块)可选参数处理是否不一致?
【发布时间】:2015-09-10 07:37:00
【问题描述】:

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

【问题讨论】:

  • 到底是什么问题?为什么不可靠?
  • 这里的不一致在哪里?例如,您将re.I 作为count 参数传递,而re.I 是一个等于2 的整数,因此您得到了两个替换。 re.M 是 8,所以你有 8 个替换。
  • 所以 re.I 或 re.M 被读作计数参数?这是预期的行为?嗯...好吧,我学到了一些新东西。谢谢!

标签: python regex optional-parameters


【解决方案1】:

注意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 保留为默认值。

【讨论】:

  • 谢谢托拜厄斯。我认为解释器足够“智能”,可以将“re.I”解析为标志。但它做相反的事情,首先将其解析为一个数字,然后根据它的位置决定它是哪个参数。坦率地说,我认为这很令人失望。这意味着如果其他参数的类型相同且未显式声明,则可能丢失的参数并没有真正丢失。哦,好吧,我会学会忍受它。
  • 不仅是它们属于同一类型。请记住,Python 是动态类型的,因此即使标志的类型不同,它仍然会代替 count 参数。当然,在这种情况下,函数的开发人员可以手动检查类型并决定将其用于什么参数,但使用整数作为标志还有其他好处,例如您可以将它们放在一起,例如re.M | re.I 将激活这两种模式。
猜你喜欢
  • 2017-01-14
  • 2015-10-31
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多