我需要一个正则表达式来验证日期。要求:其中
这是我的模式:
^(\d{4})[\/](((0[1358]|1[02])[\/](0[1-9]|[12][0-9]|3[01]))|((0[4679]|11)[\/](0[1-9]|[12][0-9]|30))|(02[\/](0[1-9]|[12][0-9])))$
我不知道如何检查闰年。
答案 0 :(得分:2)
以下是您的示例:
^(?:\d{4}\/(?:(?:(?:(?:0[13578]|1[02])\/(?:0[1-9]|[1-2][0-9]|3[01]))|(?:(?:0[469]|11)\/(?:0[1-9]|[1-2][0-9]|30))|(?:02\/(?:0[1-9]|1[0-9]|2[0-8]))))|(?:(?:\d{2}(?:0[48]|[2468][048]|[13579][26]))|(?:(?:[02468][048])|[13579][26])00)\/02\/29)$
<强> Demo 强>
答案 1 :(得分:0)
我建议您将re
与datetime
模块结合使用:
>>> datetime.datetime.strptime('1999/12/2', '%Y/%m/%d')
datetime.datetime(1999, 12, 2, 0, 0)
所以我使用的功能是:
def find_valid_dates(a_string):
'''return a list of valid datetime objects from a string'''
results = []
for match in re.finditer(r'\d{4}\/\d{2}\/\d{2}', a_string):
try:
results.append(datetime.datetime.strptime(match.group(), '%Y/%m/%d'))
except ValueError as e:
pass
return results
测试:
txt = '''2014/12/31
2012/02/29
2014/01/31
No matches
2014/13/31
2014/12/32
2014/9/31
2014/4/31
2014/6/31
2014/11/31
'''
print find_valid_dates(txt)
打印:
[datetime.datetime(2014, 12, 31, 0, 0), datetime.datetime(2012, 2, 29, 0, 0), datetime.datetime(2014, 1, 31, 0, 0)]
答案 2 :(得分:0)
我们可以简化正则表达式,如下所示:
^(:?\ d {4} - (:( ?: 0 [13578] | 1 [02]) - (?:0 [1-9] | [1-2] [0-9] | 3 [01])|(?:0 [469] | 11) - (?:0 [1-9] | [1-2] [0-9] | 30)| 02 - (?: 0 [1 -9] | 1 [0-9] | 2 [0-8]))| \ d {2}(?:[02468] [048] | [13579] [26]) - 02-29)