我需要一個正則表達式來驗證日期。要求:<日期閏年驗證正則表達式
- 格式:YYYY/MM/DD(4位年份,2個位數的月和日)
- 有效日期和月份(不允許2014/13/32)
- 閏年驗證
這裏是我的模式:
^(\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])))$
我不知道如何檢查閏年。
我需要一個正則表達式來驗證日期。要求:<日期閏年驗證正則表達式
這裏是我的模式:
^(\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])))$
我不知道如何檢查閏年。
我建議你使用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)]
這是給你的樣品:
^(?:\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)$
我們可以簡化正則表達式如下:
^(?:\ 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)
爲什麼使用正則表達式首先驗證日期? –
有些人在遇到問題時,認爲 「我知道,我會用正則表達式。」現在他們有兩個問題。 - 傑米Zawinski。 –
使用函數來驗證日期很容易。正則表達式在這裏是錯誤的選擇。 – Ehtesham