2016-09-17 15 views
0

に一致することは、私は形式で日時を考えてみましょうPythonの正規表現、任意の順序

12 September, 2016 
September 12, 2016 
2016 September, 12 
それは

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

上で与えられた任意のDATEFORMATのために、常に同じ順序で試合を返す必要がありますように私正規表現必要

私は結果を必要とします常に同じ順序で。

答えて

1

あなたは、グループの順序を切り替えることはできませんが、あなたのグループに名前を付けることができます。

(r'(?P<day>[\d]{2})(?:\s|,|\?|$)|(?P<month>[a-zA-Z]+)|(?P<year>[\d]{4})') 
  • (?P<day>[\d]{2})(?:\s|,|\?|$):マッチ:1日と一致して、l.group("day")

  • (?P<month>[a-zA-Z]+)とpythonでアクセスすることができます月には、Pythonでアクセスすることができますl.group("month")

  • (?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

+0

おかげで!これは実際に私が望むものです。それは動作します... –

0

グループの順序を変更することはできません。あなたは3つのパターンの "または"を実行し、どのグループが何にマッピングされているかを判断するために結果を渡す必要があります。これはかなりシンプルでなければなりません。

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

データがこれらの3つのフォーマットのいずれかを満たしていない場合には、 'NameError'を取得する危険性があります。現在のものと一致しません... –

+0

良い点、修正! – damjan

+0

クール - 代わりに、[here](https://stackoverflow.com/a/23581184)のような関数でラップすることができます –

関連する問題