首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与任何订单匹配的Python Regex

与任何订单匹配的Python Regex
EN

Stack Overflow用户
提问于 2016-09-17 07:53:13
回答 3查看 1K关注 0票数 1

让我们说我有这个格式的约会时间

代码语言:javascript
复制
12 September, 2016
September 12, 2016
2016 September, 12

我需要正则表达式,就像它应该以相同的顺序返回匹配,对于上面给出的任何日期格式都是一样的。

代码语言:javascript
复制
match-1 : 12
match-2 : September
match-3 : 2016

我需要的结果总是一样的顺序。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-17 12:18:22

您不能切换组顺序,但可以将组命名为:

代码语言:javascript
复制
(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中访问

示例:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-09-17 12:44:52

按照下面的建议,命名组是一种很好的方法(特别是如果已经设置了regexes ),但是为了完成任务,下面是如何使用datetime模块来处理它。

代码语言:javascript
复制
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!

"""

有关更多信息,请参见日期时间文档页

票数 2
EN

Stack Overflow用户

发布于 2016-09-17 07:57:34

不能更改组顺序。您需要执行3种模式的“或”操作,然后通过结果来确定映射到什么的组,这应该非常简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39544344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档