2015-12-11 7 views
5

Ich habe den folgenden Code zu extrahieren die DatenVerwendung von Python und Regex verschiedene Formate von Terminen

import re 
date_reg_exp2 = re.compile(r'\d{2}([-/.])(\d{2}|[a-zA-Z]{3})\1(\d{4}|\d{2})|\w{3}\s\d{2}[,.]\s\d{4}') 
matches_list = date_reg_exp2.findall("23-SEP-2015 and 23-09-2015 and 23-09-15 and Sep 23, 2015") 
print matches_list 

Der Ausgang I ist

["23-SEP-2015","23-09-2015","23-09-15","Sep 23, 2015"] 

Was ich erhalte ist erwarten zum Spiel:

[('-', 'SEP', '2015'), ('-', '09', '2015'), ('-', '09', '15'), ('', '', '')] 

Bitte überprüfen Sie den Link für regexhere.

+1

Ich denke, Ihre erste '(' an der falschen Stelle sein kann - die ersten beiden Zahlen nicht erfasst werden, die erste was Sie gesagt haben, es zu erfassen ist die '[- /.]' Sequenz –

+2

Wirklich, es ist etwas schwierig für Regex, das zu tun ... was ist nur zu verwenden '" 23-SEP-2015 und 23-09-2015 und 23-09-15 und 23.09.2015 ".split ('and')' in diesem Fall? –

+0

In diesem Fall funktioniert es, aber die Eingabezeichenfolge ist nicht wirklich durch 'und' getrennt. Es kann sein "Diese Zeichenfolge ist 23-09-2015 und es kann auch etwas sein". Ich brauche eine Übereinstimmung sagen '['23 -09-2015 ']' –

Antwort

2

Das Problem, das Sie haben, ist, dass re.findall erfasste Texte nur mit Ausnahme der Gruppe 0 (das ganze Spiel) zurückgibt. Da Sie das ganze Spiel (Gruppe 0) benötigen, brauchen Sie nur re.finditer zu verwenden und den group() Wert greifen:

matches_list = [x.group() for x in date_reg_exp2.finditer("23-SEP-2015 and 23-09-2015 and 23-09-15 and Sep 23, 2015")] 

IDEONE demo

re.findall(pattern, string, flags=0)
Zurück Alle nicht-überlappende Spiele von Muster in Zeichenfolge, als Liste von Zeichenfolgen ... Wenn eine oder mehrere Gruppen im Muster vorhanden sind, geben Sie eine Liste von Gruppen zurück; Dies wird eine Liste von Tupeln sein, wenn das Muster mehr als eine Gruppe aufweist.

re.finditer(pattern, string, flags=0)
Return ein iterator Nachgeben MatchObject Instanzen über alle nicht-überlappende Spiele für die RE Muster in String.

2

Sie könnten diese regex versuchen

date_reg_exp2 = re.compile(r'(\d{2}(/|-|\.)\w{3}(/|-|\.)\d{4})|([a-zA-Z]{3}\s\d{2}(,|-|\.|,)?\s\d{4})|(\d{2}(/|-|\.)\d{2}(/|-|\.)\d+)') 

Dann re.finditer()

for m in re.finditer(date_reg_exp2,"23-SEP-2015 and 23-09-2015 and 23-09-15 and Sep 23, 2015"): 
print m.group() 

Der Output

sein verwenden

23-September-2015
23-09-2015
23-09-15
23 Sep, 2015

+0

Ihre Regex erfasst auch etwas so (das ich nicht brauche) - '55.123.4567'. Auch '/' sagt "Unescaped Forward Slash". Also ich denke du musst '\ /' benutzen. –

+0

Ich denke, '.' kommt nicht in Ihren Daten vor, so dass nicht in der Regex enthalten sein und für'/'können Sie' \/' –

+0

In dem Beispiel habe ich oben angegeben -' .' nicht auftreten, aber in Echtzeit-Fällen treten viele '.' auf (zumindest in meinem Fall). –

0

versuchen diese

# The first (\d{2}-([A-Z]{3}|\d{2})-(\d{4}|\d{2})) group tries to match the first three types of dates 
# rest will match the last type 
dates = "23-SEP-2015 and 23-09-2015 and 23-09-15 and Sep 23, 2015" 
for x in re.finditer('((\d{2}-([A-Z]{3}|\d{2})-(\d{4}|\d{2}))|([a-zA-Z]{3}\s\d{1,2},\s\d{4}))', dates): 
    print x.group(1) 
Verwandte Themen