Was genau ist ein "Raw String Regex" und wie kann man es benutzen?
Aus der python-Dokumentation auf regexüber die '\'
Charakter:
Die Lösung ist die Verwendung von Python-raw-string-notation für reguläre
Ausdruck Muster; umgekehrte Schrägstriche sind nicht behandelt werden, in besonderer Weise in
ein string-literal mit einem Präfix'r'
. Sor"\n"
ist ein zwei-Zeichen-Strings
mit'\'
und'n'
, während"\n"
ist ein ein-Zeichen-string
mit einem newline. In der Regel Muster, ausgedrückt in Python
code mit diesem raw-string-notation.
Was ist das raw-string-notation? Wenn Sie ein raw-string-format, bedeutet das, dass "*"
ist als ein literales Zeichen, anstatt ein null-oder-mehr-Anzeige? Das kann natürlich nicht richtig sein, oder sonst regex würde vollständig verlieren Ihre Kraft. Aber dann, wenn es ein raw-string, wie funktioniert es erkennen newline-Zeichen, wenn "\n"
ist buchstäblich ein backslash und ein "n"
?
Ich nicht Folgen.
Bearbeiten für bounty:
Ich versuche zu verstehen, wie ein raw-string-regex-matches Zeilenumbrüche, Tabulatoren und Zeichen setzt, z.B. \w
für Wörter oder \d
für Ziffern oder alle was auch, wenn raw-string-Muster nicht erkennen, umgekehrte Schrägstriche als etwas anderes als normale Zeichen. Ich könnte wirklich einige gute Beispiele.
InformationsquelleAutor der Frage Aerovistae | 2012-10-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zarkonnen die Antwort keine Antwort auf Ihre Frage, aber nicht direkt. Lassen Sie mich versuchen, mehr direkte, und sehen, ob ich Sie ergreifen können, die bounty von Zarkonnen.
Werden Sie vielleicht einfacher zu verstehen, wenn Sie aufhören, die Begriffe "raw-string-regex" und "raw-string-Muster". Diese Begriffe verschmelzen zwei getrennte Konzepte: die Darstellungen einer bestimmten Zeichenfolge in Python-source-code, und das, was reguläre Ausdrücke, string repräsentiert.
In der Tat, es ist hilfreich, diese als zwei unterschiedliche Programmiersprachen, die jeweils Ihre eigene syntax. Die Python-Sprache hat-source-code, der, unter anderem, baut strings mit bestimmten Inhalten, und fordert, die regulären Ausdrücke. Die regulären Ausdrücke hat-source-code, der sich in string-Objekte, und stimmt die Saiten. Beide Sprachen verwenden umgekehrten Schrägstrich als escape-Zeichen.
Zuerst verstehen, dass ein string eine Folge von Zeichen (z.B. bytes oder Unicode-code-points; die Unterscheidung nicht viel Materie hier). Es gibt viele Möglichkeiten, die eine Zeichenfolge darstellen, die in Python-source-code. Ein raw-string ist einfach einer dieser Darstellungen. Wenn zwei Darstellungen führen die gleiche Sequenz von Zeichen, die Sie produzieren äquivalent Verhalten.
Stellen Sie sich einen 2-Zeichen-string, bestehend aus den backslash Zeichen, gefolgt von dem n Charakter. Wenn Sie wissen, dass die Zeichen Wert für backslash ist 92, und für n 110 ist, dann ist dieser Ausdruck erzeugt, wird die Zeichenfolge:
Den konventionellen Python string-notation
"\n"
nicht erstellen Sie diese Zeichenfolge. Statt dessen generiert es eine ein-Zeichen-string mit einem newline-Zeichen. Die Python-docs 2.4.1. String-Literale sagen, "Den umgekehrten Schrägstrich (\) wird verwendet, um escape-Zeichen, die sonst eine spezielle Bedeutung hat, wie newline, den umgekehrten Schrägstrich selbst, oder das quote-Zeichen".(Beachten Sie, dass der Zeilenumbruch ist nicht sichtbar, in diesem Beispiel, aber wenn Sie genau hinschauen, sehen Sie eine leere Zeile nach der "1".)
Bekommen unsere zwei-Zeichen-string, müssen wir eine andere backslash Charakter zu entkommen, die Besondere Bedeutung der ursprünglichen backslash Charakter:
Was ist, wenn Sie darstellen möchten, Zeichenfolgen, die viele backslash Zeichen in Ihnen? Python-docs 2.4.1. String-Literale weiter, "String-literalen kann Optional ein Präfix mit einem Buchstaben 'r' oder 'R'; diese Zeichenfolgen werden als raw-strings und verwenden unterschiedliche Regeln für die Interpretation der backslash-escape-Sequenzen." Hier ist unsere zwei-Zeichen-string mit raw-string-Darstellung:
Wir haben also drei verschiedene string-Darstellungen, alle geben den gleichen string, oder eine Sequenz von Zeichen:
Nun, drehen wir den regulären Ausdrücken. Die Python docs, 7.2.
re
— Regular expression operations sagt, "Reguläre Ausdrücke verwenden Sie den umgekehrten Schrägstrich (' \ ' ), um anzuzeigen, Besondere Formen oder spezielle Zeichen verwendet werden, ohne Berufung auf Ihre Besondere Bedeutung. Dies kollidiert mit Python die Verwendung der gleichen Zeichen für die gleichen Zwecke in string-literalen..."Wenn Sie möchten, eine Python reguläre Ausdrücke Objekt, das entspricht einem newline-Zeichen, dann brauchen Sie eine 2-Zeichen-string, bestehend aus den backslash Zeichen, gefolgt von dem n Charakter. Die folgenden Codezeilen legen Sie prog, um einen regulären Ausdruck Objekt, das erkennt, ein neue-Zeile-Zeichen:
Also warum ist es, dass "In der Regel Muster, ausgedrückt in Python-code mit diesem raw-string-notation".? Da reguläre Ausdrücke sind Häufig statische strings, die sind günstig vertreten als string-Literale. Und von den verschiedenen string-literal Notationen zur Verfügung, raw-strings sind eine günstige Wahl, wenn der reguläre Ausdruck enthält eine backslash Charakter.
Fragen
Q: was ist mit dem Ausdruck
re.compile(r"\s\tWord")
? Eine: Es ist einfacher zu verstehen, durch die Trennung der Strings vom regulären Ausdruck Zusammenstellung, und verstehen Sie Sie separat.Den string
s
enthält acht Buchstaben: a backslashein sein backslashein tund dann vier ZeichenWord
.Q: Was passiert mit der Tabulator-und Leerzeichen? Eine: In der Python-Sprache, level, string
s
nicht Registerkarte und Raum Charakter. Es beginnt mit vier Zeichen: backslashsbackslasht . Die regulären Ausdrücke, mittlerweile, behandelt diese Zeichenfolge als Quellcode in der Sprache für reguläre Ausdrücke, wo es heißt "übereinstimmung mit einer Zeichenfolge mit einem Leerzeichen, einem Tabulator-Zeichen, und die vier ZeichenWord
.Q: Wie wollen Sie mit denen übereinstimmen, wenn das behandelt wird, als Gegenreaktion-s und Schrägstrich-t? Eine: ist die Frage Vielleicht verständlicher, wenn die Worte 'du' und 'dass' sind mehr spezifisch: wie funktioniert die regulären Ausdrücke entsprechen die Ausdrücke spielfrei-s und Schrägstrich-t? Wie 'any whitespace character' und als 'Registerkarte Charakter'.
Q: Oder was ist, wenn Sie die 3-stellige Zeichenfolge backslash-n-newline? Eine: In der Sprache Python, die 3-stellige Zeichenfolge backslash-n-Zeilenumbruch dargestellt werden kann, wie herkömmlichen string
"\\n\n"
oder raw plus konventionellen stringr"\n" "\n"
oder auf andere Weise. Die regulären Ausdrücke entspricht der 3-Zeichen-Zeichenfolge backslash-n-newline, wenn es feststellt, dass ein zwei aufeinanderfolgenden newline Zeichen.N. B. Alle Beispiele und Literaturhinweise sind auf Python 2.7.
Update: Eingebaut Klarstellungen aus den Antworten von @Vladislav Zorov und @m.buettner und von follow-up-Frage von @Aerovistae.
InformationsquelleAutor der Antwort Jim DeLaHunt
Meisten dieser Fragen haben sich eine Menge Worte, die in Ihnen, und vielleicht ist es schwer zu finden die Antwort auf Ihre spezifische Frage zu stellen.
Wenn Sie eine regelmäßige Zeichenfolge und übergeben Sie in einem Muster wie "\t" für den RegEx-parser, Python übersetzen, die wörtliche in einen Puffer mit der tab-byte (0x09).
Wenn Sie eine raw-string und übergeben Sie in einem Muster wie r"\t" für den RegEx-parser, Python macht das nicht jede interpretation, und es schafft einen Puffer mit zwei bytes: '\ ' und 't'. (0x5c, 0x74).
Den RegEx-parser weiß, was zu tun mit der Sequenz '\t' -- es Spiele, die gegen ein tab. Es weiß auch, was zu tun mit der 0x09 Zeichen -- das entspricht auch tab. Für die meisten Teil, die Ergebnisse nicht zu unterscheiden.
Also der Schlüssel zum Verständnis, was passiert, ist zu erkennen, dass es zwei Parser werden hier beschäftigt. Der erste ist der Python-parser, und es übersetzt Ihre string-literal (oder raw-string-Literale) in eine Sequenz von bytes. Das zweite ist in Python reguläre Ausdrücke parser, und es konvertiert eine Sequenz von bytes in einen kompilierten regulären Ausdruck.
InformationsquelleAutor der Antwort Geoff Gerrietts
Scheinen Sie zu kämpfen, mit der Idee, dass ein RegEx ist nicht Teil von Python, sondern eine andere Programmiersprache mit eigenen parser und compiler. Raw-strings, die Ihnen helfen, den "source-code" RegEx sicher mit dem RegEx-parser, der dann von Ihnen Bedeutung auf Sequenzen von Zeichen wie
\d
\w
\n
usw...Das Problem besteht, da Python und RegExps verwenden
\
als escape-Zeichen, die ist, übrigens, ein Zufall - es gibt Sprachen mit anderen escape-Zeichen (wie "n" für einen Zeilenumbruch, aber auch dort muss man "\n" in RegExps). Der Vorteil ist, dass Sie nicht brauchen, um zu differenzieren zwischen raw und nicht-raw-strings in diesen Sprachen, die Sie nicht versuchen, konvertieren Sie den text und die Metzgerei, denn Sie reagieren auf unterschiedliche escape-Sequenzen.InformationsquelleAutor der Antwort Vladislav Zorov
Das Problem mit einem normalen string zu schreiben, regexes, die einen
\
ist, dass Sie am Ende mit zu schreiben\\
für jeden\
. Also die string-Literale"stuff\\things"
undr"stuff\things"
produzieren die gleiche Zeichenfolge. Dies wird besonders nützlich, wenn Sie wollen, schreiben Sie einen regulären Ausdruck, der Spiele gegen backslashes.Verwendung von normalen strings, regexp, die dem string entspricht, der
\
wäre"\\\\"
!Warum? Da haben wir die Flucht
\
zweimal: einmal für den regulären Ausdruck syntax, und einmal für den string-syntax.Können Sie dreifache Anführungszeichen Zeilenumbrüche enthalten, so wie hier:
Beachten Sie, dass in der Regel, python behandeln würde
\
-newline als zeilenfortsetzung, aber dies ist nicht der Fall im raw-strings. Auch beachten Sie, dass backslashes noch entkommen Zitate in raw strings, sondern in sich selbst. Also die raw-string-Literaler"\""
erzeugt den string\"
. Das heißt, Sie können nicht das Ende eines raw-string-Literale mit einem backslash.Sehen die lexikalische Analyse-Abschnitt der Python-Dokumentation für weitere Informationen.
InformationsquelleAutor der Antwort Zarkonnen
Den entsprechenden Python-Handbuch Abschnitt ("String-und Byte-Literale") hat eine eindeutige Erklärung der raw-string-Literale:
InformationsquelleAutor der Antwort Lorenzo Gatti