2014-06-20 136 views
-2

我需要一個正則表達式來驗證日期。要求:<日期閏年驗證正則表達式

  1. 格式:YYYY/MM/DD(4位年份,2個位數的月和日)
  2. 有效日期和月份(不允許2014/13/32)
  3. 閏年驗證

這裏是我的模式:

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

我不知道如何檢查閏年。

+7

爲什麼使用正則表達式首先驗證日期? –

+0

有些人在遇到問題時,認爲 「我知道,我會用正則表達式。」現在他們有兩個問題。 - 傑米Zawinski。 –

+2

使用函數來驗證日期很容易。正則表達式在這裏是錯誤的選擇。 – Ehtesham

回答

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

這是給你的樣品:

^(?:\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

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] |? [0131] - 02-29)