Wie finde ich alle Übereinstimmungen mit einem regulären Ausdruck in Python?

312

In einem Programm, das ich schreibe, muss Python das verwenden re.search() Funktion verwenden, um Übereinstimmungen in einem Textblock zu finden und die Ergebnisse auszudrucken. Das Programm wird jedoch beendet, sobald es die erste Übereinstimmung im Textblock gefunden hat.

Wie mache ich das wiederholt, wenn das Programm nicht stoppt, bis ALLE Übereinstimmungen gefunden wurden? Gibt es dafür eine separate Funktion?

kjakeb
quelle
Rekursive REs sind ein anderes Tier. Sie möchten die Suche wiederholen.
Outis

Antworten:

545

Verwenden Sie re.findalloder re.finditerstattdessen.

re.findall(pattern, string) Gibt eine Liste übereinstimmender Zeichenfolgen zurück.

re.finditer(pattern, string)Gibt einen Iterator über MatchObjectObjekte zurück.

Beispiel:

re.findall( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# Output: ['cats', 'dogs']

[x.group() for x in re.finditer( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')]
# Output: ['all cats are', 'all dogs are']
Bernstein
quelle
18
finditerwar das, wonach ich gesucht habe. Ich bin überrascht, dass einer Match-Objekte und die anderen Strings zurückgibt. Ich hatte erwartet, eine match_alloder match_iterFunktion zu verwenden.
dsclose
21
HAFTUNGSAUSSCHLUSS: Diese finden nur nicht überlappende Übereinstimmungen
Antoine Lizée
3
@ AntoineLizée, wie findet man Iterationen MIT Überlappung?
Raksha
16
@ Raksha - re.searchIn einer Schleife verwenden. Es wird ein MatchObjekt zurückgeben. Sie möchten Match.start() + 1als posArgument re.searchfür die nächste Iteration der Schleife übergeben.
ArtOfWarfare
3
Wenn die Übereinstimmung mehr als eine Gruppe enthält, findallwird eine Liste übereinstimmender Tupel zurückgegeben, keine Liste übereinstimmender Zeichenfolgen.
Rodorgas