Python Regex匹配任何订单

时间:2016-09-17 07:53:13

标签: python regex datetime match

假设我的日期时间格式为

12 September, 2016
September 12, 2016
2016 September, 12

我需要正则表达式,因为它应该按照上面给出的任何dateformat以相同的顺序返回匹配

match-1 : 12
match-2 : September
match-3 : 2016

我总是需要相同顺序的结果。

3 个答案:

答案 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")

  • 在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 = ""

Demo

答案 2 :(得分:0)

您无法更改群组排序。你需要做一个“或”3个模式,然后通过结果来确定哪个组映射到什么,这应该很简单。