Wie python und das regex modulieren umgekehrt

Mein aktuelles Verständnis der Python-3.4-Regex-Bibliothek aus der Sprachreferenz scheint nicht mit meinen Experiment-Ergebnissen des Moduls übereinzustimmen.


Mein aktuelles Verständnis

Die reguläre Ausdrucksmaschine kann als eine separate Entität mit ihrer eigenen Programmiersprache gedacht werden, die sie versteht (regex). Es passiert einfach, in Python, unter einer Vielzahl von anderen Sprachen zu leben. Als solches muss python (regex) Muster / Code zu diesem unabhängigen Dolmetscher passieren, wenn Sie werden.

Aus Gründen der Klarheit wird der folgende Text den Begriff der logical length – was soll bedeuten, wie lange der angegebene String logisch ist. Zum Beispiel wird der Sonderzeichen Wagenrücklauf \r len=1 da es ein einziges Zeichen ist. Allerdings haben die 2 verschiedenen Zeichen (Backslash gefolgt von einem r) \r len=2 .

1) Lasst uns sagen, wir wollen mit einem Wagenrücklauf \r len=1 in irgendeinem Text übereinstimmen

2) Wir müssen das Muster \r len=2 (2 verschiedene Zeichen) der regulären Ausdrucksmaschine zuführen

3) Die reguläre Ausdrucksmaschine empfängt \r len=2 und interpretiert das Muster als: Match-Sonderzeichen Wagenrücklauf \r len=1

4) Es geht voran und macht die Magie

Das Problem ist, dass der Backslash-Charakter \ selbst von der Python-Interpreter als etwas Besonderes verwendet wird – ein Charakter, der dazu bestimmt ist, anderen Sachen zu entkommen (wie zitiert)

Wenn wir also in python codieren und die Idee ausdrücken müssen, dass wir das Muster \r len=2 an den internen regulären Ausdrucksinterpreter senden müssen, müssen wir das pattern = '\\r' oder alternativ das pattern = r'\r' Ausdrücken \r len=2 .


Und alles ist gut … bis

Ich versuche ein paar Experimente mit re.escape

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben


Zusammenfassung der Fragen

1) Bitte bestätige / modifiziere mein aktuelles Verständnis des Regex-Motors

2) Warum sind diese vermeintlichen Nicht-Lehrbuch-Definitionsmuster passend

3) Was auf der Erde ist los mit \\\r aus re.escape , und das ganze "wir haben die gleichen String Längen, aber wir verglichen ungleich, aber wir alle auch das gleiche bei der Anpassung einer Wagenrückkehr in der vorherigen re.search Test "

One Solution collect form web for “Wie python und das regex modulieren umgekehrt”

Sie müssen verstehen, dass jedes Mal, wenn Sie ein Muster schreiben, es zuerst als String interpretiert wird, bevor es gelesen und interpretiert ein zweites Mal von der Regex-Engine. Lets beschreiben, was passiert:

 >>> s='\r' 

S enthält das Zeichen CR.

 >>> re.match('\r', s) <_sre.SRE_Match object; span=(0, 1), match='\r'> 

Hier ist der String '\r' ein String, der CR enthält, so dass ein Literal CR der Regex Engine gegeben wird.

 >>> re.match('\\r', s) <_sre.SRE_Match object; span=(0, 1), match='\r'> 

Der String ist jetzt ein wörtlicher Backslash und ein Literal r, der Regex-Motor erhält diese beiden Charaktere und da \r ist eine Regex-Escape-Sequenz, die auch ein CR-Zeichen bedeutet, erhältst du auch ein Match.

 >>> re.match('\\\r', s) <_sre.SRE_Match object; span=(0, 1), match='\r'> 

Der String enthält einen wörtlichen Backslash und einen Literal CR, der Regex-Motor empfängt \ und CR , aber da \CR keine bekannte Regex-Escape-Sequenz ist, wird der Backslash ignoriert und du erhältst ein Match.

Beachten Sie, dass für den Regex-Motor ein wörtlicher Backslash die Escape-Sequenz \\ (also in einem Muster-String r'\\' oder '\\\\' )

  • Python: multiline regelmäßiger ausdruck
  • Mit Reichweite in regex für arabische Buchstaben
  • Bestimmen des unübertroffenen Teils eines Strings unter Verwendung eines Regex in Python
  • Regulärer Ausdruck: Bereich finden, außer für einen Buchstaben oder einen Bereich
  • Python re.finditer match.groups () enthält nicht alle Gruppen von match
  • Entfernen Sie alle Repliken einer Zeichenfolge mehr als x Zeichen lang (regex?)
  • Python - re.split: extra leere Strings, die die Anfangs- und Endliste haben
  • Python-String-Split mit Regex
  • Python-Regex-Parse-Stream
  • REGEX-String und entkommenes Zitat
  • Parsing ungültiges Anker-Tag mit BeautifulSoup oder Regex
  • Python ist die beste Programmiersprache der Welt.