2016-12-08 1 views
1

Vielen Dank im Voraus für das Lesen.Gibt alle überlappenden Muster mit re.findall() in Python zurück?

Ich habe eine Zeichenfolge:

A = "a levels" 

Ich möchte alle folgenden möglichen Variationen der A-Ebene entsprechen:

Pattern = r"a level|a levels" 

(Die Form dieser Muster festgelegt ist, kann ich es nicht ändern wie folgt

["a level","a levels"] 

I findall benutzen.) der Suche nach wünsche ich zu bekommen :

B = re.findall(Pattern,A) 

und erhält:

B = "a level" 

re.findall paßt nur das erste Glied und ignoriert den zweiten überlappende Begriff.

Per: Python regex find all overlapping matches? Ich habe versucht, mit:

B = re.findall(Pattern,A,overlapped = True) 

und erhalten den folgenden Fehler:

TypeError: findall() got an unexpected keyword argument 'overlapped' 

Offensichtlich overlapped nicht als Schlüsselwort-Argument gibt es nicht mehr ...

Ich schaute dann auf diese Frage: Python regex find all overlapping matches? und versuchte:

C = re.finditer(Pattern,A) 
results = match.group() 

results = "a level" 

Also nicht besser.

Wie bekomme ich den gewünschten Ausgang?

Relevante qu: How to find overlapping matches with a regexp?

+0

Sie können überlappende Strings nur bei verschiedenen Indizes abgleichen. –

+0

Ich bin mir nicht sicher, ob es möglich ist zu erreichen, was Sie wollen, aber der überlappende Fehler kann über 'pip install regex 'und dann' import regex als re 'behoben werden. Regex ist neuere Version des Regex-Moduls für Python. –

+0

@saurabhbaid. Leider wird die "überlappende" Option in "Regex" das Problem hier nicht lösen, da es nicht mit Alternation funktioniert. – ekhumoro

Antwort

1

Wenn alle alle möglichen Pattern ähnlich, was Sie gezeigt haben, könnte dies für Sie arbeiten:

B=[b for pat in Pattern.split('|') for b in re.findall(pat, A)] 

Natürlich ist diese Verallgemeinerung nicht über Pattern sein eine Reihe von einfachen Alternativen.

+0

Danke Rob. Es sieht also so aus, als ob Sie den String durch '|' teilen und dann '.findall' auf jedem der Split-Elemente ausführen, wenn ich das richtig verstehe? Das Lustige ist, ich habe mit einer Version von Pattern begonnen, die wie 'Pattern = [" a level "," a levels "...]' aussah und sie in 'Pattern =" a level | a levels ... "umwandelte. 'Vielleicht kann ich das loswerden und dann nur den' finden' Teil deiner Antwort implementieren ...Wenn alles zusammen ist, werde ich sehen, welcher Weg schneller ist und das auswählen. Danke für die Hilfe :) – Chuck

Verwandte Themen