正则表达式?和{}量词

时间:2014-02-09 05:14:19

标签: python regex

我正在尝试创建一个正则表达式来验证检查闰年年份的数字。这是代码的一部分。由于某种原因,这段代码会将4 8 24 28作为有效的正则表达式。

(0{2}?)
([2468][480] | [13579][26])



pattern = re.compile (r"""

    ((0{2}?)([2468][480] | [13579][26]))

    """, re.X)

当我遗漏时

(0{2}?)

24 12,一切正常......

我正在使用详细信息,所以间距不应该重要..

无效

12
24
28
16

编辑::实际上现在一切都无效..

我不明白为什么24无效而28无效这根本没有意义。感谢您的指导。

2 个答案:

答案 0 :(得分:4)

当你写(0{2}?)时,这意味着“在这里匹配两个0,但匹配尽可能少”。非贪婪对于{n}量词来说没有意义(对于{n,}{m,n}有效) - 您的意思是(0{2})?吗?

哦,请记住,可以被400 整除的年数闰年。

答案 1 :(得分:3)

使用re.DEBUG标志显示有关表达式的调试信息,我们得到

>>> pattern = re.compile(r'0{2}?', re.DEBUG)
min_repeat 2 2
  literal 48

min_repeat表示0{2}?未被解释为?应用于0{2}。它被解释为一个懒惰的量词,试图从2到2任意次数匹配0,但尽可能少。这与文档似乎并不相符;文档仅显示{m,n}?表单。