Unterschiedliches Verhalten zwischen re.finden Sie heraus, und re.findall

Ich erhalte dieses Beispiel aus regulären Ausdrucksoperationen in Python 2.* Dokumentation und das hier ausführlich beschriebene Beispiel mit einigen Änderungen. Um das ganze Beispiel zu erklären, lassen Sie uns string type variable call,

text = "He was carefully disguised but captured quickly by police."

und das Muster des regulären Ausdrucks vom Kompilierungstyp als,

regEX = r"\w+ly"pattern = re.compile(regEX)

\w der Mittelwert entspricht einem beliebigen Wortzeichen (alphanumerischer & Unterstrich), der Mittelwert + entspricht 1 oder mehr des vorhergehenden Tokens, und die gesamte Bedeutung besteht darin, ein beliebiges Wort auszuwählen, das mit ly endet. Es gibt nur zwei 2 Wörter (’sorgfältig‘ und ’schnell‘), die den obigen regulären Ausdruck erfüllen.

Vor dem Umzug in re.findall() oder re.finditer(), mal sehen, was re tut.search() bedeutet in Python 2.* Dokumentation.

Durchsuchen Sie die Zeichenfolge nach der ersten Stelle, an der das Muster für reguläre Ausdrücke eine Übereinstimmung erzeugt, und geben Sie eine entsprechende MatchObject-Instanz zurück. Geben Sie None zurück, wenn keine Position in der Zeichenfolge mit dem Muster übereinstimmt; Beachten Sie, dass dies sich von der Suche nach einer Übereinstimmung der Länge Null an einem bestimmten Punkt in der Zeichenfolge unterscheidet.

Die folgenden Codezeilen geben Ihnen das grundlegende Verständnis von re.Suche().

search = pattern.search(text)print(search)print(type(search))#output<re.Match object; span=(7, 16), match='carefully'><class 're.Match'>

Es wird wieder erzeugen.MatchObject des Klassentyps object mit 13 unterstützten Methoden und Attributen gemäß Python 2.* Dokumentation. Diese span() -Methode besteht aus den Start- und Endpunkten (7 und 16 im obigen Beispiel) des übereinstimmenden Wortes in der Variablen text. re.die search() -Methode berücksichtigt nur die allererste Übereinstimmung, andernfalls wird None zurückgegeben.

Lassen Sie uns auf die Frage eingehen, bevor Sie sehen, was re tut.finditer() bedeutet in Python 2.* Dokumentation.

Gibt einen Iterator zurück, der MatchObject Instanzen über alle nicht überlappenden Übereinstimmungen für das RE Muster in string . Die Zeichenfolge wird von links nach rechts gescannt, und Übereinstimmungen werden in der gefundenen Reihenfolge zurückgegeben. Leere Übereinstimmungen sind im Ergebnis enthalten.

Die nächsten Codezeilen geben Ihnen das grundlegende Verständnis von re.finditer().

finditer = pattern.finditer(text)print(finditer)print(type(finditer))#output<callable_iterator object at 0x040BB690><class 'callable_iterator'>

Das obige Beispiel gibt uns die Iteratorobjekte, die Schleife sein müssen. Dies ist offensichtlich nicht das Ergebnis, das wir wollen. Lassen Sie uns finditer schleifen und sehen, was sich in diesen Iteratorobjekten befindet.

for anObject in finditer: print(anObject) print(type(anObject)) print()#output<re.Match object; span=(7, 16), match='carefully'><class 're.Match'><re.Match object; span=(40, 47), match='quickly'><class 're.Match'>

Diese Ergebnisse sind dem re sehr ähnlich.search() Ergebnis, das wir früher bekommen. Aber wir können das neue Ergebnis in der obigen Ausgabe <re.Match object; span=(40, 47), match='quickly'> sehen. Wie ich bereits in Python 2 erwähnt habe.* Dokumentation, re.search() durchsucht die Zeichenfolge nach der ersten Stelle, an der das reguläre Ausdrucksmuster eine Übereinstimmung erzeugt, und re .finditer() durchsucht die Zeichenfolge nach allen Stellen, an denen das Muster für reguläre Ausdrücke Übereinstimmungen erzeugt, und gibt mehr Details als re zurück.findall() Methode.

Hier, was bedeutet re.findall() bedeutet in Python 2.* Dokumentation.

Gibt alle nicht überlappenden Übereinstimmungen von Mustern in Zeichenfolgen als Liste von Zeichenfolgen zurück. Die Zeichenfolge wird von links nach rechts gescannt, und Übereinstimmungen werden in der gefundenen Reihenfolge zurückgegeben. Wenn eine oder mehrere Gruppen im Muster vorhanden sind, geben Sie eine Liste von Gruppen zurück; Dies ist eine Liste von Tupeln, wenn das Muster mehr als eine Gruppe enthält. Leere Übereinstimmungen sind im Ergebnis enthalten.

Lassen Sie uns verstehen, was in re passiert.findall().

findall = pattern.findall(text)print(findall)print(type(findall))#output<class 'list'>

Diese Ausgabe gibt uns nur die übereinstimmenden Wörter in der Variablen text , andernfalls wird eine leere Liste zurückgegeben. Diese Liste in der Ausgabe, die dem Attribut match in re ähnelt.MatchObjekt.

Hier ist der vollständige Code und ich habe es in Python 3.7 versucht.

import retext = "He was carefully disguised but captured quickly by police."regEX = r"\w+ly"pattern = re.compile(regEX)search = pattern.search(text)print(search)print(type(search))print()findall = pattern.findall(text)print(findall)print(type(findall))print()finditer = pattern.finditer(text)print(finditer)print(type(finditer))print()for anObject in finditer: print(anObject) print(type(anObject)) print()