Python正则表达式匹配日期

时间:2011-01-17 03:02:29

标签: python regex date

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

9 个答案:

答案 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工作正常;

  1. 14-11-2017
  2. 2017年11月14日
  3. 14 | 11 | 2017
  4. 可以接受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])$)可以处理以下格式:

  • 2019年10月1日
  • 1.1.2019
  • 1.1.19
  • 12/03/2020
  • 01.05.1950

第二部分(^([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年的所有内容,并且只给出两个数字就可以了。

如果您有改进的建议,请在评论中让我知道,以便我更新答案。

答案 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)

输出:文字…………文字