我正在尝试匹配给定字符串中的任意数量的正确格式日期。要使日期格式正确,必须以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')]
请帮我找到正确的正则表达式
E:我只希望仅匹配2012年至2015年。
答案 0 :(得分:3)
如果您将正则表达式更改为:
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