我使用Python中的正则表达式来匹配这样的日期:“11/12/98”?
答案 0 :(得分:42)
通常最好将字符串解析为datetime.datetime
对象,而不是使用正则表达式:
In [140]: datetime.datetime.strptime("11/12/98","%m/%d/%y")
Out[140]: datetime.datetime(1998, 11, 12, 0, 0)
In [141]: datetime.datetime.strptime("11/12/98","%d/%m/%y")
Out[141]: datetime.datetime(1998, 12, 11, 0, 0)
然后,您可以访问datetime.datetime
对象的属性作为日期,月份和年份(以及小时,分钟和秒):
In [143]: date.year
Out[143]: 1998
In [144]: date.month
Out[144]: 11
In [145]: date.day
Out[145]: 12
要测试由正斜杠分隔的数字序列是否代表有效日期,您可以使用try..except
块。无效日期会引发ValueError
:
In [159]: try:
.....: datetime.datetime.strptime("99/99/99","%m/%d/%y")
.....: except ValueError as err:
.....: print(err)
.....:
.....:
time data '99/99/99' does not match format '%m/%d/%y'
如果您需要搜索更长的字符串以查找日期, 您可以使用正则表达式搜索由正斜杠分隔的数字:
In [146]: import re
In [152]: match = re.search(r'(\d+/\d+/\d+)','The date is 11/12/98')
In [153]: match.group(1)
Out[153]: '11/12/98'
当然,无效日期也会匹配:
In [154]: match = re.search(r'(\d+/\d+/\d+)','The date is 99/99/99')
In [155]: match.group(1)
Out[155]: '99/99/99'
要检查match.group(1)
是否返回有效的日期字符串,您可以使用datetime.datetime.strptime
解析它,如上所示。
答案 1 :(得分:3)
我发现以下格式的以下RE工作正常;
可以接受2000 - 2020年的年度
请不要忘记在最后添加$,如果不是,则接受14-11-201或20177
date="13-11-2017"
x=re.search("^([1-9] |1[0-9]| 2[0-9]|3[0-1])(.|-)([1-9] |1[0-2])(.|-|)20[0-9][0-9]$",date)
x.group()
输出=' 13-11-2017'
答案 2 :(得分:2)
使用此正则表达式,您可以验证不同类型的日期/时间样本,只需稍作更改即可。
^\d\d\d\d/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$
->对此进行验证:2018/7/12 13:00:00
对于您的格式,您可以cad将其更改为:
^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[0-2])/\d\d$
->对此进行验证:98/11/12
答案 3 :(得分:1)
我在@aditya Prakash方法之上构建了解决方案:
print(re.search("^([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])(\.|-|/)([1-9]|0[1-9]|1[0-2])(\.|-|/)([0-9][0-9]|19[0-9][0-9]|20[0-9][0-9])$|^([0-9][0-9]|19[0-9][0-9]|20[0-9][0-9])(\.|-|/)([1-9]|0[1-9]|1[0-2])(\.|-|/)([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])$",'01/01/2018'))
第一部分(^([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])(\.|-|/)([1-9]|0[1-9]|1[0-2])(\.|-|/)([0-9][0-9]|19[0-9][0-9]|20[0-9][0-9])$
)可以处理以下格式:
第二部分(^([0-9][0-9]|19[0-9][0-9]|20[0-9][0-9])(\.|-|/)([1-9]|0[1-9]|1[0-2])(\.|-|/)([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])$
)基本上可以执行相同的操作,但是顺序相反,首先是年份,然后是月份,然后是日期。
作为分隔符,它允许。,/,-。多年来,它允许从1900年至2099年的所有内容,并且只给出两个数字就可以了。
如果您有改进的建议,请在评论中让我知道,以便我更新答案。
答案 4 :(得分:1)
由于问题标题要求找到很多日期的正则表达式,所以我想提出一个新的解决方案,尽管已经有很多解决方案了。
为了查找字符串在这个千年(2000-2999)中的所有日期,对我来说,它的工作如下:
dates = re.findall('([1-9]|1[0-9]|2[0-9]|3[0-1]|0[0-9])(.|-|\/)([1-9]|1[0-2]|0[0-9])(.|-|\/)(20[0-9][0-9])',dates_ele)
dates = [''.join(dates[i]) for i in range(len(dates))]
此正则表达式可以在同一字符串中找到多个日期,例如 bla Bla 8.05 / 2020 \ n BLAH bla15 / 05-2020 blaa 。正如人们所看到的那样,该日期可以具有。或-,而不是同时 / 。
一些解释
更具体地说,它可以找到格式为day,moth year的日期。 Day是一个数字整数或零,然后是一个数字整数或1或2,然后是一个数字整数或3,然后是0或1。月份是一个数字整数或零,然后是一个数字整数或1,然后是分别是0、1或2。Year是数字20,后跟00至99之间的任何数字。
有用的笔记
通过在两个| symbol
的末尾添加(.|-|\/)
,可以添加更多的日期分割符号。例如,添加-就是(.|-|\/|--)
要在本千年之外有很多年,必须将(20[0-9][0-9])
修改为([0-9][0-9][0-9][0-9])
答案 5 :(得分:1)
我用这样的东西
>>> import datetime
>>> regex = datetime.datetime.strptime
>>>
>>> # TEST
>>> assert regex('2020-08-03', '%Y-%m-%d')
>>>
>>> assert regex('2020-08', '%Y-%m-%d')
ValueError: time data '2020-08' does not match format '%Y-%m-%d'
>>> assert regex('08/03/20', '%m/%d/%y')
>>>
>>> assert regex('08-03-2020', '%m/%d/%y')
ValueError: time data '08-03-2020' does not match format '%m/%d/%y'
答案 6 :(得分:0)
根据我的理解,仅是为了匹配给定字符串中的这种格式,我更喜欢此正则表达式:
pattern='[0-9|/]+'
为了更严格地匹配格式,可以使用以下功能:
pattern='(?:[0-9]{2}/){2}[0-9]{2}'
我个人不同意unutbu的回答,因为有时我们使用正则表达式进行“查找”和“提取”,而不仅仅是“验证”。
答案 7 :(得分:0)
有时我们需要从字符串中获取日期。 分组的一个示例:
record = '1518-09-06 00:57 some-alphanumeric-charecter'
pattern_date_time = ([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}) .+
match = re.match(pattern_date_time, record)
if match is not None:
group = match.group()
date = group[0]
print(date) // outputs 1518-09-06 00:57
答案 8 :(得分:0)
我使用这样的东西:
string="text 24/02/2021 ... 24-02-2021 ... 24_02_2021 ... 24|02|2021 text"
new_string = re.sub(r"[0-9]{1,4}[\_|\-|\/|\|][0-9]{1,2}[\_|\-|\/|\|][0-9]{1,4}", ' ', string)
print(new_string)
输出:文字…………文字