使用 python 正则表达式匹配日期

Posted

技术标签:

【中文标题】使用 python 正则表达式匹配日期【英文标题】:match dates using python regular expressions 【发布时间】:2012-04-16 05:42:11 【问题描述】:

我想匹配具有以下格式的日期:

2010-08-27, 2010/08/27

现在我对日期的实际可行性并不是很特别,但只是它的格式正确。

请告诉正则表达式。

谢谢

【问题讨论】:

这是非常基本的。你自己尝试过什么吗? 您只想检查格式还是转换格式?如果您还想转换,请查看 'time.strptime' - 它不需要任何正则表达式。 【参考方案1】:

您可以使用datetime 模块来解析日期:

import datetime

print datetime.datetime.strptime('2010-08-27', '%Y-%m-%d')
print datetime.datetime.strptime('2010-15-27', '%Y-%m-%d')

输出:

2010-08-27 00:00:00
Traceback (most recent call last):
  File "./x.py", line 6, in <module>
    print datetime.datetime.strptime('2010-15-27', '%Y-%m-%d')
  File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '2010-15-27' does not match format '%Y-%m-%d'

所以捕捉ValueError 会告诉你日期是否匹配:

def valid_date(datestring):
    try:
        datetime.datetime.strptime(datestring, '%Y-%m-%d')
        return True
    except ValueError:
        return False

要允许各种格式,您可以测试所有可能性,或者先使用re 解析出字段:

import datetime
import re

def valid_date(datestring):
        try:
                mat=re.match('(\d2)[/.-](\d2)[/.-](\d4)$', datestring)
                if mat is not None:
                        datetime.datetime(*(map(int, mat.groups()[-1::-1])))
                        return True
        except ValueError:
                pass
        return False

【讨论】:

我想使用正则表达式匹配 DD/MM/YYYY ,DD-MM-YYYY 模式日期,并将此类字符串替换为 'DATE' 字符串。使用python 好吧,您可以再次测试函数中所有可能的变体,或者使用正则表达式提取数字。我会更新答案。【参考方案2】:

您可以使用此代码:

import re

# regular expression to match dates in format: 2010-08-27 and 2010/08/27 
# date_reg_exp = re.compile('(\d+[-/]\d+[-/]\d+)')

更新以下正则表达式:

# regular expression to match dates in format: 2010-08-27 and 2010/08/27
# and with mixed separators 2010/08-27
# date_reg_exp = re.compile('\d4[-/]\d2[-/]\d2')

# if separators should not be mixed use backreference:
date_reg_exp = re.compile('\d4(?P<sep>[-/])\d2(?P=sep)\d2')

# a string to test the regular expression above
test_str= """
     fsf2010/08/27sdfsdfsd
     dsf sfds f2010/08/26 fsdf 
     asdsds 2009-02-02 afdf
     """
# finds all the matches of the regular expression and
# returns a list containing them
matches_list=date_reg_exp.findall(test_str)

# iterates the matching list and prints all the matches
for match in matches_list:
  print match

【讨论】:

好的,我认为 hochl 的答案是最好的,因为它使用可以验证日期的datetime。然后,如果您想使用正则表达式来执行此操作,最好使用 jamylak 提供的:"\d4[-/]\d2[-/]\d2",因为它还会检查年份字符串的长度是否为 4 个字符,而日期和月份的长度是否恰好为 2 个字符。 :) 请告诉我如何在匹配字符串中替换新模式 你给出了很好的答案,你能告诉如何匹配时间格式 00:08 是的,你可以使用这个正则表达式:time_reg_exp = re.compile('(\d2:\d2)'),整体会和我的回答类似。如果你想投票给我的问题,请! :) 应该提到,提供的正则表达式还匹配带有混合分隔符的日期,例如“2010/08-27”。【参考方案3】:

使用datetime 模块。这是一个为了知识而使用的正则表达式,尽管您不应该使用它:

r'\d4[-/]\d2[-/]\d2'

【讨论】:

【参考方案4】:

dateutil 包有一个非常智能的日期解析器。它解析各种日期格式。 http://pypi.python.org/pypi/python-dateutil

【讨论】:

以上是关于使用 python 正则表达式匹配日期的主要内容,如果未能解决你的问题,请参考以下文章

python正则表达式匹配中文日期时间

用Python中的正则表达式匹配日期?

正则表达式模式匹配python中的日期时间

使用正则表达式匹配 yyyymmdd 中的日期格式

Python: 字符串搜索和匹配,re.compile() 编译正则表达式字符串,然后使用match() , findall() 或者finditer() 等方法

正则表达式以匹配西班牙日期