我正在编写一个正则表达式来验证从2020年开始的年份。
以下是我写的正则表达式
^(20-99)(20-99)$
它似乎不起作用。任何人都可以指出哪里弄错了?
答案 0 :(得分:5)
正则表达式不会采用这样的范围。你会想要做的事情:
if( year >= 2020 )
presto
我很轻浮,因为你正试图使用正则表达式,你只需要使用直接的比较。如果你有一个字符串,首先将字符串转换为整数(如果你甚至需要用Python做)。否则,你将会有一些难以维护的非常丑陋的正则表达式。
编辑:如果您真的热衷于使用正则表达式(或三个),那么您的问题可以分为三个正则表达式:^20[2-9]\d$
,^2[1-9]\d\d$
,^[3-9]\d{3}$
四个字符年。您可以将这些组合到^(20[2-9]\d|2[1-9]\d\d|[3-9]\d{3})$
。
但请注意,正则表达式是a)丑陋如地狱,而b)只接受多达9999年。您可以通过明智地使用+
来缓解这一点,所以类似于:
^(20[2-9]\d+|2[1-9]\d{2,}|[3-9]\d{3,})$
......可以工作。
但我希望你会发现只做year >= 2020
会好很多。
编辑2:地狱,这个正则表达式错误的年份大于9999.你可能想要使用:
^(20[2-9]\d|2[1-9]\d{2}|[3-9]\d{3}|[1-9]\d{4,})$
如果您输入03852
之类的年份,那仍然无效。
答案 1 :(得分:1)
不确定python但是w.r.t.正则表达式它不像你在想的那样工作......范围是针对单个字符的。所以如果由于某种原因你必须有一个regexp(即:某种regexp数据填充验证引擎):
^20[2-9][0-9]|[2-9][1-9][0-9][0-9]$
2020-2099或2100-9999的任何数字。
答案 2 :(得分:0)
这是一个显着缩短的正则表达式,可以满足您的需求:
^(?![01]|20[01])\d{4}$
验证:
>>> regex = re.compile(r'^(?![01]|20[01])\d{4}$')
>>> all(regex.match(str(x)) if x >= 2020 else not regex.match(str(x)) for x in xrange(10000))
True