Ich verstehe, dass das Muster r'([a-z]+)+'
im Suchstring nach einem wiederholten Muster mit mehreren Zeichen sucht, aber ich verstehe nicht warum, wenn k2
antwort nicht 'aaaaa' (5 'a') ist:
Python 3.6.1
Der Schlüssel ist hier backtracking . Wann immer ein Muster quantifizierte Untermuster mit unterschiedlicher Länge enthält, kann die Regex-Maschine Strings auf verschiedene Arten zuordnen, und wenn ein Teil des Regex nach dem quantifizierten Teil nicht mit einem Teilstring übereinstimmt, kann er zurückverfolgen , dh frei up ein Zeichen, das zu dem quantifizierten Muster gehört und versuche, mit den nachfolgenden Untermustern übereinzustimmen.
Sehen Sie sich das Gesamtbild an:
Mal sehen, wie kürzere Strings passen, bevor Sie bei den längeren Beispielen springen ...
Warum wird a
nicht gefunden? Weil mindestens 2 Zeichen vorhanden sein müssen, da [a-z]+
und +
mindestens 1 Zeichen benötigen.
aa
wird abgeglichen, da die erste ([a-z]+)
zuerst mit der gesamten Zeichenfolge übereinstimmte und dann zurückverfolgt wurde, um Text für das +
-Muster aufzunehmen (und stimmt mit der zweiten a
überein), also gibt es eine Übereinstimmung.
Three- a
string aaa
stimmt als Ganzes überein, weil die erste ([a-z]+)
zuerst mit der gesamten Zeichenfolge übereinstimmte und dann zurückversetzt wurde, um Text für das +
-Muster aufzunehmen (beachten Sie, dass die Erfassungsgruppe nur eine enthalten musste) a
wie beim Versuch mit zwei aa
, stimmt die +
nicht mit der letzten dritten a
überein, und es gibt eine Übereinstimmung von drei a
s.
Kommen Sie nun zu den Beispielen in der Frage
Die aaaa
-Zeichenkette stimmt in ihrer Gesamtheit mit der aa
übereinstimmenden überein: Das einfangende Gruppenmuster erfasst zuerst die gesamte aaaa
, dann die Rückverfolgung, da +
auch einen Text "finden" muss Die Regex-Engine versucht, aaa
in Gruppe 1 einzufangen. +
stimmt jedoch nicht mit 3 a
s überein, so dass Backtracking fortgesetzt wird und wenn in Gruppe 1 zwei a
s vorhanden sind, stimmt die quantifizierte Rückreferenz mit der überein die letzten zwei a
s.
Und der k2
Fall jetzt:
Die Zeichenfolge aaaaa
passt wie folgt:
aaaaa
wird erfasst und mit dem ([a-z]+)
part +
kann keinen Text finden, die Engine versucht, die Zeichenfolge anders zu finden, da der Teil vor +
aufgrund des +
quantifier aaaa
wird versucht (= in Gruppe 1 platziert), ohne Erfolg, da +
nicht übereinstimmt (da dann
versucht, aaaa
zu finden, aber nur a
vor dem Ende der Zeichenkette übrig ist) aaa
wird erneut versucht, ohne Erfolg (als
versucht, aaa
zu finden, aber es sind nur noch zwei a
s übrig) aa
wird in Gruppe 1 eingefügt,
stimmt mit der dritten und vierten a
s überein, und das ist die einzige Übereinstimmung, da nur ein a
in der Zeichenfolge verbleibt. Hier ist ein Beispielschema für die Übereinstimmung der Zeichenfolge :
Der letzte a
konnte nicht gefunden werden: