假设我的日期时间格式为
12 September, 2016
September 12, 2016
2016 September, 12
我需要正则表达式,因为它应该按照上面给出的任何dateformat以相同的顺序返回匹配
match-1 : 12
match-2 : September
match-3 : 2016
我总是需要相同顺序的结果。
答案 0 :(得分:2)
下面建议的命名组是一种很好的方法(特别是如果你已经设置了正则表达式),但为了完成起见,这里是如何使用datetime
模块处理它。
from datetime import datetime as date
def parse_date(s):
formats = ["%d %B, %Y",
"%B %d, %Y",
"%Y %B, %d"]
for f in formats:
try:
return date.strptime(s, f)
except ValueError:
pass
raise ValueError("Invalid date format!")
arr = ["12 September, 2016",
"September 12, 2016",
"2016 September, 12",
"12/9/2016"]
for s in arr:
dt = parse_date(s)
print(dt.year, dt.strftime("%B"), dt.day)
"""
2016 September 12
2016 September 12
2016 September 12
Traceback (most recent call last):
File "C:/Python33/datetest.py", line 22, in <module>
dt = parse_date(s)
File "C:/Python33/datetest.py", line 19, in parse_date
raise ValueError("Invalid date format!")
ValueError: Invalid date format!
"""
有关详细信息,请参阅datetime documentation page。
答案 1 :(得分:1)
您无法切换群组订单,但您可以为群组命名:
(r'(?P<day>[\d]{2})(?:\s|,|\?|$)|(?P<month>[a-zA-Z]+)|(?P<year>[\d]{4})')
(?P<day>[\d]{2})(?:\s|,|\?|$)
:匹配一天,可以使用l.group("day")
(?P<month>[a-zA-Z]+)
:匹配一个月,可以使用l.group("month")
(?P<year>[\d]{4})
:匹配一年,可以使用l.group("year")
示例:
import re
data = """
12 September, 2016
September 12, 2016
2016 September, 12
September 17, 2012
17 October, 2015
"""
rgx = re.compile(r'(?P<day>[\d]{2})(?:\s|,|\?|$)|(?P<month>[a-zA-Z]+)|(?P<year>[\d]{4})')
day = ""
month = ""
year = ""
for l in rgx.finditer(data):
if(l.group("day")):
day = l.group("day")
elif(l.group("month")):
month = l.group("month")
elif(l.group("year")):
year = l.group("year")
if(day != "" and month != "" and year != ""):
print "{0} {1} {2}".format(day, month, year)
day = ""
month = ""
year = ""
答案 2 :(得分:0)
您无法更改群组排序。你需要做一个“或”3个模式,然后通过结果来确定哪个组映射到什么,这应该很简单。