Python 如何编写正则表达式来验证DAY、MONTH dd、yyyy类型的日期格式?
我有一个日期字符串,如2018年12月13日星期四,即日、月日、年,我需要用正则表达式验证它 正则表达式不应验证不正确的日期或月份。例如,2018年12月13日星期三和2018年12月32日星期四应标记为无效 到目前为止,我能做的是为“,”和“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
^([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