我正在尝试创建一个正则表达式来验证检查闰年年份的数字。这是代码的一部分。由于某种原因,这段代码会将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无效这根本没有意义。感谢您的指导。
答案 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}?
表单。