日期闰年验证正则表达式

时间:2014-06-20 03:02:23

标签: regex date

我需要一个正则表达式来验证日期。要求:其中

  1. 格式:yyyy / mm / dd(4位数年份,2位数月份和日期)
  2. 有效日期和月份(不允许2014/13/32)
  3. 闰年验证
  4. 这是我的模式:

    ^(\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])))$
    

    我不知道如何检查闰年。

3 个答案:

答案 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)$

Regular expression visualization

<强> Demo

答案 1 :(得分:0)

我建议您将redatetime模块结合使用:

>>> 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)