Reguläre Ausdrücke - andere Zeichenfolgen stimmen überein

8

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:

%Vor%

Python 3.6.1

    
Maxim Andreev 06.02.2018, 16:30
quelle

2 Antworten

2

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
  • in Gruppe 1 platziert
  • + kann keinen Text finden, die Engine versucht, die Zeichenfolge anders zu finden, da der Teil vor + aufgrund des + quantifier
  • mit einem anderen Text übereinstimmen kann
  • 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:

    
Wiktor Stribiżew 06.02.2018, 23:08
quelle
6

Weil + ist gierig.

Was passiert, ist, dass ([a-z]+) zuerst mit 'aaaaa' übereinstimmt, dann wird es zurückverfolgt, bis + mit der Zeichenkette übereinstimmt und stoppt. Weil 'aa' der erste Wert von ([a-z]+) ist, der erfolgreich abgleicht, gibt er das zurück.

    
C_Elegans 06.02.2018 16:34
quelle

Tags und Links