Zarkonnens Antwort beantwortet Ihre Frage, aber nicht direkt. Lassen Sie mich versuchen, direkter zu sein und zu sehen, ob ich das Kopfgeld von Zarkonnen bekommen kann.
Sie werden dies vielleicht leichter verstehen, wenn Sie die Begriffe "Raw String Regex" und "Raw String Patterns" nicht mehr verwenden. Diese Begriffe verbinden zwei separate Konzepte: die Darstellungen einer bestimmten Zeichenfolge im Python-Quellcode und den regulären Ausdruck, den diese Zeichenfolge darstellt.
In der Tat ist es hilfreich, sich diese als zwei verschiedene Programmiersprachen mit jeweils eigener Syntax vorzustellen. Die Python-Sprache verfügt über Quellcode, der unter anderem Zeichenfolgen mit bestimmten Inhalten erstellt und das reguläre Ausdruckssystem aufruft. Das System mit regulären Ausdrücken verfügt über Quellcode, der sich in Zeichenfolgenobjekten befindet und mit Zeichenfolgen übereinstimmt. Beide Sprachen verwenden Backslash als Escape-Zeichen.
Verstehen Sie zunächst, dass eine Zeichenfolge eine Folge von Zeichen ist (dh Bytes oder Unicode-Codepunkte; die Unterscheidung spielt hier keine große Rolle). Es gibt viele Möglichkeiten, eine Zeichenfolge im Python-Quellcode darzustellen. Eine rohe Zeichenfolge ist einfach eine dieser Darstellungen. Wenn zwei Darstellungen zu derselben Zeichenfolge führen, erzeugen sie ein gleichwertiges Verhalten.
Stellen Sie sich eine 2-stellige Zeichenfolge vor, die aus dem Backslash- Zeichen gefolgt vom n- Zeichen besteht. Wenn Sie wissen, dass der Zeichenwert für Backslash 92 und für n 110 ist, generiert dieser Ausdruck unsere Zeichenfolge:
s = chr(92)+chr(110)
print len(s), s
2 \n
Die herkömmliche Python-String-Notation "\n"
generiert diesen String nicht. Stattdessen wird eine einstellige Zeichenfolge mit einem Zeilenumbruchzeichen generiert. Die Python-Dokumente 2.4.1. String-Literale sagen: "Das Backslash-Zeichen (\) wird verwendet, um Zeichen zu maskieren, die ansonsten eine besondere Bedeutung haben, z. B. Zeilenumbruch, Backslash selbst oder Anführungszeichen."
s = "\n"
print len(s), s
1
(Beachten Sie, dass die neue Zeile in diesem Beispiel nicht sichtbar ist. Wenn Sie jedoch genau hinschauen, wird nach der "1" eine leere Zeile angezeigt.)
Um unsere zweistellige Zeichenfolge zu erhalten, müssen wir ein anderes Backslash- Zeichen verwenden, um der besonderen Bedeutung des ursprünglichen Backslash- Zeichens zu entgehen :
s = "\\n"
print len(s), s
2 \n
Was ist, wenn Sie Zeichenfolgen darstellen möchten, die viele Backslash- Zeichen enthalten? Python-Dokumente 2.4.1. String-Literale fahren fort: "String-Literalen kann optional ein Buchstabe 'r' oder 'R' vorangestellt werden. Solche Strings werden als Raw-Strings bezeichnet und verwenden unterschiedliche Regeln für die Interpretation von Backslash-Escape-Sequenzen." Hier ist unsere zweistellige Zeichenfolge mit roher Zeichenfolgendarstellung:
s = r"\n"
print len(s), s
2 \n
Wir haben also drei verschiedene Zeichenfolgendarstellungen, die alle dieselbe Zeichenfolge oder Zeichenfolge enthalten:
print chr(92)+chr(110) == "\\n" == r"\n"
True
Wenden wir uns nun den regulären Ausdrücken zu. Die Python-Dokumente, 7.2. re
- Bei Operationen mit regulären Ausdrücken heißt es: "Reguläre Ausdrücke verwenden das Backslash-Zeichen ('\'), um Sonderformen anzugeben oder die Verwendung von Sonderzeichen zu ermöglichen, ohne ihre besondere Bedeutung aufzurufen. Dies kollidiert mit Pythons Verwendung desselben Zeichens für denselben Zweck in String-Literale ... "
Wenn Sie ein Python-Objekt mit regulären Ausdrücken möchten, das einem Zeilenumbruchzeichen entspricht, benötigen Sie eine 2-stellige Zeichenfolge, die aus dem Backslash- Zeichen gefolgt vom n- Zeichen besteht. Die folgenden Codezeilen setzen prog auf ein Objekt mit regulären Ausdrücken, das ein Zeilenumbruchzeichen erkennt:
prog = re.compile(chr(92)+chr(110))
prog = re.compile("\\n")
prog = re.compile(r"\n")
Warum also "werden Muster normalerweise in Python-Code unter Verwendung dieser rohen String-Notation ausgedrückt." ? Weil reguläre Ausdrücke häufig statische Zeichenfolgen sind, die bequem als Zeichenfolgenliterale dargestellt werden. Aus den verschiedenen verfügbaren Zeichenfolgenliteralnotationen sind Rohzeichenfolgen eine bequeme Wahl, wenn der reguläre Ausdruck ein Backslash- Zeichen enthält.
Fragen
F : Was ist mit dem Ausdruck re.compile(r"\s\tWord")
? A : Es ist einfacher zu verstehen, wenn Sie die Zeichenfolge von der Zusammenstellung regulärer Ausdrücke trennen und separat verstehen.
s = r"\s\tWord"
prog = re.compile(s)
Die Zeichenfolge s
enthält acht Zeichen: einen Backslash , ein s , einen Backslash , ein t und dann vier Zeichen Word
.
F : Was passiert mit den Tabulator- und Leerzeichen? A : Auf der Python-Sprachebene hat die Zeichenfolge s
keine Tabulator- und Leerzeichen . Es beginnt mit vier Zeichen: Backslash , s , Backslash , t . Das System für reguläre Ausdrücke behandelt diese Zeichenfolge unterdessen als Quellcode in der Sprache für reguläre Ausdrücke. Dabei bedeutet dies "Übereinstimmung mit einer Zeichenfolge, die aus einem Leerzeichen, einem Tabulatorzeichen und den vier Zeichen besteht Word
.
F : Wie passen Sie zu diesen, wenn dies als Backlash-s und Backslash-t behandelt wird? A : Vielleicht ist die Frage klarer, wenn die Wörter "Sie" und "das" spezifischer gemacht werden: Wie passt das System der regulären Ausdrücke zu den Ausdrücken "Backlash-s" und "Backslash-t"? Als 'beliebiges Leerzeichen' und als ' Tabulatorzeichen '.
F : Oder was ist, wenn Sie die 3-stellige Zeichenfolge Backslash-n-Newline haben? A : In der Python-Sprache kann die 3-stellige Zeichenfolge Backslash-n-Newline als herkömmliche Zeichenfolge "\\n\n"
oder als rohe plus herkömmliche Zeichenfolge r"\n" "\n"
oder auf andere Weise dargestellt werden. Das System für reguläre Ausdrücke entspricht dem Backslash-n-Newline mit drei Zeichenfolgen, wenn zwei aufeinanderfolgende Zeilenumbrüche gefunden werden .
NB Alle Beispiele und Dokumentverweise beziehen sich auf Python 2.7.
Update : Eingeschlossene Klarstellungen aus den Antworten von @Vladislav Zorov und @ m.buettner sowie aus der Folgefrage von @Aerovistae.