让我们说我有这个格式的约会时间
12 September, 2016
September 12, 2016
2016 September, 12我需要正则表达式,就像它应该以相同的顺序返回匹配,对于上面给出的任何日期格式都是一样的。
match-1 : 12
match-2 : September
match-3 : 2016我需要的结果总是一样的顺序。
发布于 2016-09-17 12:18:22
您不能切换组顺序,但可以将组命名为:
(r'(?P<day>[\d]{2})(?:\s|,|\?|$)|(?P<month>[a-zA-Z]+)|(?P<year>[\d]{4})')(?P<day>[\d]{2})(?:\s|,|\?|$):匹配一天,可以用l.group("day")在python中访问(?P<month>[a-zA-Z]+):匹配一个月,可以用l.group("month")在python中访问(?P<year>[\d]{4}):匹配一年,可以用l.group("year")在python中访问示例:
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 = ""发布于 2016-09-17 12:44:52
按照下面的建议,命名组是一种很好的方法(特别是如果已经设置了regexes ),但是为了完成任务,下面是如何使用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!
"""有关更多信息,请参见日期时间文档页。
发布于 2016-09-17 07:57:34
不能更改组顺序。您需要执行3种模式的“或”操作,然后通过结果来确定映射到什么的组,这应该非常简单。
https://stackoverflow.com/questions/39544344
复制相似问题