2014-02-09 64 views
0

我正在尝试创建一个正则表达式来验证检查闰年的年份的数字。这是代码的一部分。由于某些原因,这段代码会让数字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 

编辑:: Ac现在所有都是无效的..

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

+4

但为什么使用正则表达式来验证闰年。 – anubhava

+0

为什么你会使用'{1}'?它什么也没做。 – user2357112

+2

我们遇到了问题。 “等等,我知道正则表达式。”现在我们有两个问题。 –

回答

3

当您编写(0{2}?)时,表示“在这里匹配两个0 s,但匹配尽可能少”。非贪婪对于一个{n}量词(它对{n,}{m,n}确实没有意义) - 你的意思是(0{2})?

呵呵,千万记住,可以被400 整除的年份是闰年。

+0

是的,这是我的错误。谢谢!什么样的错误我在找什么和我应该看哪些文档?非常感谢。 –

+0

@LeonardLie:我不认为这是在任何地方具体记录,但大多数量词可以有一个'?'追加到他们,使他们不贪婪。请记住,量词不能直接跟量词。 – Ryan

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}?表单。