2016-10-07 4 views
1

Wie schreibt man pythisch, wenn mehrere Regex-Muster zum Testen vorhanden sind und übereinstimmende Gruppen extrahiert werden, wenn ein Test erfolgreich ist?Pythonische Schreibweise für mehrere Regex-Tests

Das heißt, was ist das Pythonic-Äquivalent des folgenden Code-Snippets?

if re.match(pattern1, string): 
    m = re.match(pattern1, string) 
    grps = m.groups() 
    ...[process matched groups for pattern1]... 
elif re.match(pattern2, string): 
    m = re.match(pattern2, string) 
    grps = m.groups() 
    ...[process matched groups for pattern2]... 
elif re.match(pattern3, string): 
    m = re.match(pattern3, string) 
    grps = m.groups() 
    ...[process matched groups for pattern3]... 
+0

Wie kompliziert sind diese Regex-Muster? Sie könnten _ sie in einzelne Regex kombinieren. Oder es ist einfacher, sie einfach in eine Liste (oder ein Tupel) zu schreiben und die Liste zu durchlaufen. –

Antwort

0

Im Grunde, was ich will, ist:

m = re.match(pattern1, string) 
if m: 
    grps = m.groups() 
    print(pattern1) 
else: 
    m = re.match(pattern2, string) 
    if m: 
     grps = m.groups() 
     print(pattern2) 

Und das ist die beste Art die ich gefunden habe, die eine case Aussage ahmt in vielen Sprachen vorhanden:

while True: 
    m = re.match(pattern1, string) 
    if m: 
     grps = m.groups() 
     print(pattern1) 
     break 
    m = re.match(pattern2, string) 
    if m: 
     grps = m.groups() 
     print(pattern2) 
     break 

Nicht sicher, ich bin der Erfinder von case in Python. Aber aus dem Text können wir sehen, dass der zweite eine konstante Einrückung hat, während der erste eine lineare Einrückung hat. Der Algorithmusprofessor hat uns gesagt O(1) ist besser als O(n).

3
patterns = [pattern1, pattern2, pattern3] 
for pattern in patterns: 
    m = re.match(pattern, string) 
    if m: 
     grps = m.groups() 
     ... 
     break 
+0

Verschiedene Muster müssen unterschiedlich verarbeitet werden. Es wird also zusätzliche, wenn ... anders ... tiefer in der Aussage verschachtelt werden. Nicht sicher, ob das Python ist. – Cyker

0

eine Funktion für jedes Muster machen, dass die resultierenden Gruppen behandelt. Dann können Sie die Liste Verständnis verwenden:

lst = [(pattern1, func1), (p2, f2)...] 
results = [func(match.groups()) for (match, func) in [(re.match(patt, theStr), func) for (patt, func) in lst] if match] 
Verwandte Themen