Python正则表达式匹配日期

clu*_*ter 38 python regex date

我使用Python中的正则表达式来匹配这样的日期:"11/12/98"?

unu*_*tbu 45

而不是使用正则表达式,通常最好将字符串解析为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)
Run Code Online (Sandbox Code Playgroud)

然后,您可以访问日,月和年(以及小时,分钟和秒)作为datetime.datetime对象的属性:

In [143]: date.year
Out[143]: 1998

In [144]: date.month
Out[144]: 11

In [145]: date.day
Out[145]: 12
Run Code Online (Sandbox Code Playgroud)

要测试由正斜杠分隔的数字序列是否表示有效日期,您可以使用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'
Run Code Online (Sandbox Code Playgroud)

如果需要搜索更长的字符串以查找日期,可以使用正则表达式搜索由正斜杠分隔的数字:

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'
Run Code Online (Sandbox Code Playgroud)

当然,无效日期也将匹配:

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'
Run Code Online (Sandbox Code Playgroud)

要检查match.group(1)返回有效的日期字符串,您可以使用datetime.datetime.strptime如上所示解析它.


adi*_*ash 5

我发现以下 RE 在以下格式中对 Date 工作正常;

  1. 14-11-2017
  2. 14.11.2017
  3. 14|11|2017

它可以接受 2000-2099 年

请不要忘记在最后添加 $,如果没有它接受 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()
Run Code Online (Sandbox Code Playgroud)

输出 = '13-11-2017'


Her*_*ert 5

我在 @aditya Prakash appraoch 之上构建了我的解决方案:

 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'))
Run Code Online (Sandbox Code Playgroud)

第一部分 ( ^([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])$) 可以处理以下格式:

  • 2019年10月1日
  • 2019年1月1日
  • 1.1.19
  • 12/03/2020
  • 1950年5月1日

第二部分 ( ^([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])$) 基本上可以执行相同的操作,但顺序相反,其中首先是年份,然后是月份,然后是日期。

  • 2020/02/12

作为分隔符,它允许 .、/、-。作为年份,它允许从 1900 年到 2099 年的所有内容,也可以只给出两个数字。

如果您有改进建议,请在评论中告诉我,以便我更新答案。


Azi*_*lto 5

我用这样的东西

>>> 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'

Run Code Online (Sandbox Code Playgroud)