Python 如何在字符串中匹配日期模式

Python 如何在字符串中匹配日期模式,python,regex,date,Python,Regex,Date,我试图匹配给定字符串中任意数量的正确格式日期。要使日期格式正确,它必须以dd mm yyyy的形式出现。因此dd和mm不能只有一个数字,它们需要2个数字,并且必须在正确的范围内;这意味着日期必须介于1和31之间,月份必须介于1和12之间 我让它为一种类型的输入工作,但它与另一种输入不匹配。 这是我的密码: #!/usr/bin/env python from sys import stdin from re import compile myFormat = compile(r'(?=([0-

我试图匹配给定字符串中任意数量的正确格式日期。要使日期格式正确,它必须以dd mm yyyy的形式出现。因此dd和mm不能只有一个数字,它们需要2个数字,并且必须在正确的范围内;这意味着日期必须介于1和31之间,月份必须介于1和12之间

我让它为一种类型的输入工作,但它与另一种输入不匹配。 这是我的密码:

#!/usr/bin/env python
from sys import stdin
from re import compile

myFormat = compile(r'(?=([0-2]\d|3[0-1])-(0\d|1[0-2])-(201[3-5]))' )
print myFormat.findall(stdin.readline())
输入1:

777-444---21-12-2013-12-2013-12-2013---444-777
输出:

[('21', '12', '2013'), ('13', '12', '2013'), ('13', '12', '2013')]
到目前为止还不错。但如果我有意见的话:

0012-10-2012-10-2012
一点也不匹配。正确的输出应该是:

[('12', '10', '2012'), ('12', '10', '2012')]
请帮我找到正确的正则表达式来执行此操作

编辑
我只想匹配2012年到2015年。如果您将正则表达式更改为:

myFormat = compile(r'(?=([0-2]\d|3[0-1])-(0\d|1[0-2])-(201[2-5]))' )
它将起作用(只需将最后一个
[3-5]
更改为
[2-5]
)。目前没有,因为您有:

201[3-5]
今年的部分,所以它拒绝匹配2012年

检查有效性:

from sys import stdin
from re import compile
from datetime import datetime
myFormat = compile(r'(?=([0-2]\d|3[0-1])-(0\d|1[0-2])-(201[2-5]))' )
str1=("0012-10-2012-10-2012", "0031-02-2012");
for s in str1:
    for date in myFormat.findall(s):
        (d,m,y) = map(int, date)
        try:
           datetime(y,m,d)
           print date
        except: pass

我认为这与2016年的日期不符。我也不认为。那么OP想要匹配所有可能的日期?1976年?我也这么认为,因为模式是
yyyy
?啊,没关系-似乎OP有一个特定的范围。如果日期确实有效,这很重要吗<代码>31-02-2013在这里将是正匹配。是的,这是因为我只想匹配有效日期,这就是为什么我使用数字范围而不是“\d”,如果是这样,您应该尝试使用
datetime
转换匹配项,以确保日期与实际日历日期相对应,而不仅仅是一组与您的模式匹配的数字。我想我现在的新问题是如何使用datetime?重叠日期意味着检查日期范围,但实际的问题是用字符串搜索日期模式。