Heim >Backend-Entwicklung >Python-Tutorial >Warum gibt „re.findall()' keine überlappenden Regex-Übereinstimmungen zurück und wie kann ich das beheben?

Warum gibt „re.findall()' keine überlappenden Regex-Übereinstimmungen zurück und wie kann ich das beheben?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-06 10:23:12418Durchsuche

Why Doesn't `re.findall()` Return Overlapping Regex Matches, and How Can I Fix It?

Eingehendere Einblicke in überlappende Regex-Übereinstimmungen

In der Welt der regulären Ausdrücke kann es rätselhaft sein zu verstehen, warum bestimmte Übereinstimmungen möglicherweise nicht gefunden werden. Betrachten Sie das folgende Beispiel:

match = re.findall(r'\w\w', 'hello')
print(match)

Wie erwartet gibt dieses Snippet eine Liste mit „he“ und „ll“ zurück, die dem Muster von Zwei-Buchstaben-Sequenzen entsprechen. Allerdings könnte man sich fragen, warum „el“ und „lo“, die ebenfalls zum Muster zu passen scheinen, nicht im Ergebnis enthalten sind.

Dieses Verhalten ist auf das Standardverhalten der Funktion re.findall zurückzuführen, die erzeugt keine überlappenden Übereinstimmungen. Mit anderen Worten, es bewegt sich entlang der Zeichenfolge, findet nur die erste Übereinstimmung für ein bestimmtes Muster und berücksichtigt keine möglichen Überlappungen.

Um dieses Problem zu beheben, gibt es eine clevere Problemumgehung mit Lookahead-Behauptungen. Eine Lookahead-Behauptung (?=...) stimmt mit einem Muster überein, ohne tatsächlich einen Teil der Zeichenfolge zu verbrauchen. Dadurch können wir alle überlappenden Übereinstimmungen finden, die dem gegebenen Muster entsprechen.

Um beispielsweise alle Zwei-Buchstaben-Sequenzen in der Zeichenfolge „Hallo“ mithilfe einer Lookahead-Behauptung zu finden, kann der folgende Ausdruck verwendet werden:

re.findall(r'(?=(\w\w))', 'hello')

Dieser Ausdruck gibt eine Liste zurück, die ['he', 'el', 'll', 'lo'] enthält, da jede Zwei-Buchstaben-Sequenz ohne Erfolg erfolgreich abgeglichen wird Überlappung.

Das Verständnis von Lookahead-Behauptungen und ihrer praktischen Anwendungen kann die Effektivität regulärer Ausdrücke für komplexe Matching-Szenarien erheblich verbessern.

Das obige ist der detaillierte Inhalt vonWarum gibt „re.findall()' keine überlappenden Regex-Übereinstimmungen zurück und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn