Python 如何编写正则表达式来验证DAY、MONTH dd、yyyy类型的日期格式?

Python 如何编写正则表达式来验证DAY、MONTH dd、yyyy类型的日期格式?,python,regex,Python,Regex,我有一个日期字符串,如2018年12月13日星期四,即日、月日、年,我需要用正则表达式验证它 正则表达式不应验证不正确的日期或月份。例如,2018年12月13日星期三和2018年12月32日星期四应标记为无效 到目前为止,我能做的是为“,”和“yyyy”编写表达式。我不明白如何自定义正则表达式,使其只接受正确的日期和月份名称 我的尝试: ^([something would come over here for day name]day)([\,]|[\, ])(something would

我有一个日期字符串,如2018年12月13日星期四,即日、月日、年,我需要用正则表达式验证它

正则表达式不应验证不正确的日期或月份。例如,2018年12月13日星期三和2018年12月32日星期四应标记为无效

到目前为止,我能做的是为“,”和“yyyy”编写表达式。我不明白如何自定义正则表达式,使其只接受正确的日期和月份名称

我的尝试:

^([something would come over here for day name]day)([\,]|[\, ])(something would come over here for month name)(0?[1-9]|[12][0-9]|3[01])([\,]|[\, ])([12][0-9]\d\d)$
谢谢


编辑:我只包括从1000年开始的年份-2999年。验证闰年并不重要。

您可以尝试一个库,它为您这样的“复杂”案例实现正则表达式。这叫做datefinder

这家伙让你在文本中找到任何类型的日期:

要安装:pip安装datefinder

import datefinder

string_with_dates = "entries are due by January 4th, 2017 at 8:00pm
    created 01/15/2005 by ACME Inc. and associates."

matches = datefinder.find_dates(string_with_dates)

for match in matches:
    print(match)

# Output
2017-01-04 20:00:00
2005-01-15 00:00:00
要检测像“Muesday”这样的错误单词,您可以使用拼写检查器过滤文本,如


regex
不是解决问题的方法

但这里有一些示例代码,您可以看到如何编写模式中的日期名称部分。我还添加了如何使用
strptime()
的示例,这是一个更好的解决方案:

import re
from datetime import datetime

s = """
Thursday, December 13, 2018
Muesday, December 13, 2018
Monday, January 13, 2018
Thursday, December 32, 2018
"""

pat = r"""
^
(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\ 
([\,]|[\, ])\ 
(January|February|March|April|May|June|July|August|September|October|November|December)\ 
(0?[1-9]|[12][0-9]|3[01])
([\,]|[\, ])\ 
([12][0-9]\d\d)
$
"""

for match in re.finditer(pat, s, re.VERBOSE+re.MULTILINE):
    print match

for row in s.split('\n'):
    try:
        match = datetime.strptime(row, '%A, %B %d, %Y')
        print match
    except:
        print "'%s' is not valid"%row

我会尝试将其转换为
datetime
,如果成功,您将获胜。。正则表达式更难阅读、理解、扩展和调试。。类似于:您应该将字符串定义为日期并检查它是否有效。有很多库就是为了这个(例如,
dateFns
moment.js
,等等)。否则,您将如何验证像31这样的复杂用例。六月还是仅仅是一个错误的工作日名称使用正则表达式?
import re
from datetime import datetime

s = """
Thursday, December 13, 2018
Muesday, December 13, 2018
Monday, January 13, 2018
Thursday, December 32, 2018
"""

pat = r"""
^
(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\ 
([\,]|[\, ])\ 
(January|February|March|April|May|June|July|August|September|October|November|December)\ 
(0?[1-9]|[12][0-9]|3[01])
([\,]|[\, ])\ 
([12][0-9]\d\d)
$
"""

for match in re.finditer(pat, s, re.VERBOSE+re.MULTILINE):
    print match

for row in s.split('\n'):
    try:
        match = datetime.strptime(row, '%A, %B %d, %Y')
        print match
    except:
        print "'%s' is not valid"%row