re — Reguläre Ausdrucksoperationen¶
Quellcode: Lib/re/
Dieses Modul stellt Operationen zur Mustererkennung mit regulären Ausdrücken bereit, ähnlich denen, die in Perl zu finden sind.
Sowohl Muster als auch zu durchsuchende Zeichenketten können Unicode-Zeichenketten (str) als auch 8-Bit-Zeichenketten (bytes) sein. Unicode-Zeichenketten und 8-Bit-Zeichenketten dürfen jedoch nicht gemischt werden: Das heißt, Sie können keine Unicode-Zeichenkette mit einem Bytes-Muster oder umgekehrt abgleichen. Ebenso muss die Ersatzzeichenkette beim Anfordern einer Ersetzung vom selben Typ sein wie sowohl das Muster als auch die Suchzeichenkette.
Reguläre Ausdrücke verwenden den Backslash ('\'), um Sonderformen anzuzeigen oder um Sonderzeichen zu ermöglichen, die ohne ihre spezielle Bedeutung verwendet werden können. Dies kollidiert mit Pythons Verwendung desselben Zeichens für denselben Zweck in Zeichenkettenliteralen; zum Beispiel müsste man, um einen literalen Backslash abzugleichen, möglicherweise '\\\\' als Musterzeichenkette schreiben, da der reguläre Ausdruck \\ sein muss und jeder Backslash als \\ innerhalb eines regulären Python-Zeichenkettenliterals ausgedrückt werden muss. Beachten Sie außerdem, dass ungültige Escape-Sequenzen in Pythons Verwendung des Backslash in Zeichenkettenliteralen nun eine SyntaxWarning erzeugen und in Zukunft zu einem SyntaxError werden. Dieses Verhalten tritt auch dann auf, wenn es sich um eine gültige Escape-Sequenz für einen regulären Ausdruck handelt.
Die Lösung besteht darin, Pythons Raw-String-Notation für reguläre Ausdrucksmuster zu verwenden; Backslashes werden in einem Zeichenkettenliteral, dem 'r' vorangestellt ist, nicht speziell behandelt. Also ist r"\n" eine zweizeichige Zeichenkette, die '\' und 'n' enthält, während "\n" eine einzeichenige Zeichenkette ist, die einen Zeilenumbruch enthält. Normalerweise werden Muster im Python-Code mit dieser Raw-String-Notation ausgedrückt.
Es ist wichtig zu beachten, dass die meisten Operationen für reguläre Ausdrücke als Modulfunktionen und Methoden für kompilierte reguläre Ausdrücke verfügbar sind. Die Funktionen sind Verknüpfungen, die nicht erfordern, dass Sie zuerst ein Regex-Objekt kompilieren, aber einige Feinabstimmungsparameter fehlen.
Siehe auch
Das Drittanbieter-Modul regex, das eine API hat, die mit dem Standardbibliotheksmodul re kompatibel ist, aber zusätzliche Funktionalität und eine gründlichere Unicode-Unterstützung bietet.
Syntax regulärer Ausdrücke¶
Ein regulärer Ausdruck (oder RE) spezifiziert eine Menge von Zeichenketten, die dazu passen; die Funktionen in diesem Modul lassen Sie prüfen, ob eine bestimmte Zeichenkette zu einem gegebenen regulären Ausdruck passt (oder ob ein gegebener regulärer Ausdruck zu einer bestimmten Zeichenkette passt, was auf dasselbe hinausläuft).
Reguläre Ausdrücke können verkettet werden, um neue reguläre Ausdrücke zu bilden; wenn A und B beides reguläre Ausdrücke sind, dann ist AB auch ein regulärer Ausdruck. Im Allgemeinen gilt: Wenn eine Zeichenkette p zu A passt und eine andere Zeichenkette q zu B passt, dann passt die Zeichenkette pq zu AB. Dies gilt, es sei denn, A oder B enthalten Operationen mit niedriger Priorität; Begrenzungen zwischen A und B; oder haben nummerierte Gruppenreferenzen. So können komplexe Ausdrücke leicht aus einfacheren primitiven Ausdrücken wie den hier beschriebenen aufgebaut werden. Details zur Theorie und Implementierung von regulären Ausdrücken finden Sie im Friedl-Buch [Frie09] oder in praktisch jedem Lehrbuch über Compilerbau.
Eine kurze Erklärung des Formats von regulären Ausdrücken folgt. Weitere Informationen und eine sanftere Darstellung finden Sie im Regular Expression HOWTO.
Reguläre Ausdrücke können sowohl Sonder- als auch normale Zeichen enthalten. Die meisten normalen Zeichen, wie 'A', 'a' oder '0', sind die einfachsten regulären Ausdrücke; sie passen einfach auf sich selbst. Sie können normale Zeichen verketten, sodass last auf die Zeichenkette 'last' passt. (Im Rest dieses Abschnitts werden wir REs in diesem Sonderstil schreiben, normalerweise ohne Anführungszeichen, und Zeichenketten, die abgeglichen werden sollen, 'in einfachen Anführungszeichen'.)
Einige Zeichen, wie '|' oder '(', sind speziell. Sonderzeichen stehen entweder für Klassen von normalen Zeichen oder beeinflussen, wie die umgebenden regulären Ausdrücke interpretiert werden.
Wiederholungsoperatoren oder Quantifizierer (*, +, ?, {m,n}, etc.) können nicht direkt verschachtelt werden. Dies vermeidet Mehrdeutigkeit mit dem nicht-gierigen Modifikator-Suffix ? und mit anderen Modifikatoren in anderen Implementierungen. Um eine zweite Wiederholung auf eine innere Wiederholung anzuwenden, können Klammern verwendet werden. Zum Beispiel passt der Ausdruck (?:a{6})* auf jede Vielfache von sechs 'a'-Zeichen.
Die Sonderzeichen sind
.(Punkt.) Im Standardmodus passt dies auf jedes Zeichen außer einem Zeilenumbruch. Wenn das Flag
DOTALLangegeben wurde, passt dies auf jedes Zeichen, einschließlich eines Zeilenumbruchs.(?s:.)passt auf jedes Zeichen unabhängig von den Flags.
^(Caret.) Passt auf den Anfang der Zeichenkette und passt im
MULTILINE-Modus auch unmittelbar nach jedem Zeilenumbruch.
$Passt auf das Ende der Zeichenkette oder kurz vor den Zeilenumbruch am Ende der Zeichenkette, und passt im
MULTILINE-Modus auch vor einem Zeilenumbruch.foopasst sowohl auf 'foo' als auch auf 'foobar', während der reguläre Ausdruckfoo$nur auf 'foo' passt. Interessanterweise passt die Suche nachfoo.$in'foo1\nfoo2\n'im normalen Modus auf 'foo2', aber imMULTILINE-Modus auf 'foo1'; die Suche nach einem einzelnen$in'foo\n'findet zwei (leere) Treffer: einen kurz vor dem Zeilenumbruch und einen am Ende der Zeichenkette.
*Bewirkt, dass der resultierende RE 0 oder mehr Wiederholungen des vorhergehenden REs abgleicht, so viele Wiederholungen wie möglich.
ab*passt auf 'a', 'ab' oder 'a', gefolgt von einer beliebigen Anzahl von 'b's.
+Bewirkt, dass der resultierende RE 1 oder mehr Wiederholungen des vorhergehenden REs abgleicht.
ab+passt auf 'a', gefolgt von einer beliebigen nicht-null Anzahl von 'b's; es passt nicht nur auf 'a'.
?Bewirkt, dass der resultierende RE 0 oder 1 Wiederholungen des vorhergehenden REs abgleicht.
ab?passt auf entweder 'a' oder 'ab'.
*?,+?,??Die Quantifizierer
'*','+'und'?'sind alle gierig; sie passen so viel Text wie möglich. Manchmal ist dieses Verhalten unerwünscht; wenn der RE<.*>gegen'<a> b <c>'abgeglichen wird, passt er auf die gesamte Zeichenkette und nicht nur auf'<a>'. Das Hinzufügen von?nach dem Quantifizierer bewirkt, dass er den Abgleich im nicht-gierigen oder minimalen Modus durchführt; es werden so wenige Zeichen wie möglich abgeglichen. Die Verwendung des RE<.*?>passt nur auf'<a>'.
*+,++,?+Ähnlich wie die Quantifizierer
'*','+'und'?'passen auch diejenigen, bei denen'+'angehängt ist, so oft wie möglich. Im Gegensatz zu den echten gierigen Quantifizierern erlauben diese jedoch kein Backtracking, wenn der folgende Ausdruck nicht passt. Dies sind sogenannte possessive Quantifizierer. Zum Beispiel passta*aauf'aaaa', weila*alle 4'a's abgleicht, aber wenn das endgültige'a'angetroffen wird, wird der Ausdruck zurückverfolgt, sodass am Endea*insgesamt 3'a's abgleicht und das vierte'a'durch das endgültige'a'abgeglichen wird. Wenn jedocha*+averwendet wird, um'aaaa'abzugleichen, passta*+auf alle 4'a', aber wenn das endgültige'a'keine weiteren Zeichen zum Abgleichen findet, kann der Ausdruck nicht zurückverfolgt werden und schlägt somit fehl.x*+,x++undx?+sind äquivalent zu(?>x*),(?>x+)und(?>x?)entsprechend.Hinzugefügt in Version 3.11.
{m}Gibt an, dass genau m Kopien des vorherigen REs abgeglichen werden sollen; weniger Treffer führen dazu, dass der gesamte RE nicht passt. Zum Beispiel passt
a{6}auf genau sechs'a'-Zeichen, aber nicht auf fünf.{m,n}Bewirkt, dass der resultierende RE von m bis n Wiederholungen des vorherigen REs abgleicht, wobei versucht wird, so viele Wiederholungen wie möglich abzugleichen. Zum Beispiel passt
a{3,5}auf 3 bis 5'a'-Zeichen. Wenn m weggelassen wird, wird eine untere Grenze von null angegeben, und wenn n weggelassen wird, wird eine unendliche obere Grenze angegeben. Als Beispiel passta{4,}bauf'aaaab'oder tausend'a'-Zeichen gefolgt von einem'b', aber nicht auf'aaab'. Das Komma darf nicht weggelassen werden, da der Modifikator sonst mit der zuvor beschriebenen Form verwechselt würde.{m,n}?Bewirkt, dass der resultierende RE von m bis n Wiederholungen des vorherigen REs abgleicht, wobei versucht wird, so wenige Wiederholungen wie möglich abzugleichen. Dies ist die nicht-gierige Version des vorherigen Quantifizierers. Zum Beispiel passt auf der 6-zeichenlangen Zeichenkette
'aaaaaa'a{3,5}auf 5'a'-Zeichen, währenda{3,5}?nur 3 Zeichen abgleicht.{m,n}+Bewirkt, dass der resultierende RE von m bis n Wiederholungen des vorherigen REs abgleicht, wobei versucht wird, so viele Wiederholungen wie möglich abzugleichen, ohne Backtracking-Punkte einzurichten. Dies ist die possessive Version des obigen Quantifizierers. Zum Beispiel versucht
a{3,5}+aaauf der 6-zeichenlangen Zeichenkette'aaaaaa', 5'a'-Zeichen abzugleichen, und benötigt dann 2 weitere'a's, mehr Zeichen als verfügbar, und schlägt somit fehl, währenda{3,5}aamita{3,5}5 abgleicht, dann 4'a's durch Backtracking und dann die endgültigen 2'a's durch das endgültigeaaim Muster abgeglichen werden.x{m,n}+ist äquivalent zu(?>x{m,n}).Hinzugefügt in Version 3.11.
\Escapet Sonderzeichen (damit Sie Zeichen wie
'*','?'usw. abgleichen können) oder signalisiert eine Sondersequenz; Sondersequenzen werden unten besprochen.Wenn Sie keinen Raw-String zur Angabe des Musters verwenden, denken Sie daran, dass Python den Backslash auch als Escape-Sequenz in Zeichenkettenliteralen verwendet; wenn die Escape-Sequenz vom Python-Parser nicht erkannt wird, werden der Backslash und das folgende Zeichen in die resultierende Zeichenkette aufgenommen. Wenn Python die resultierende Sequenz jedoch erkennen würde, muss der Backslash zweimal wiederholt werden. Dies ist kompliziert und schwer zu verstehen, daher wird dringend empfohlen, Raw-Strings für alle außer den einfachsten Ausdrücken zu verwenden.
[]Wird verwendet, um eine Zeichenmenge anzugeben. In einer Menge
Zeichen können einzeln aufgeführt werden, z. B. passt
[amk]auf'a','m'oder'k'.
Zeichenbereiche können angegeben werden, indem zwei Zeichen angegeben und durch ein
'-'getrennt werden. Zum Beispiel passt[a-z]auf jeden Kleinbuchstaben der ASCII-Zeichen,[0-5][0-9]passt auf alle zweistelligen Zahlen von00bis59und[0-9A-Fa-f]passt auf jede Hexadezimalziffer. Wenn-escaped wird (z. B.[a\-z]) oder wenn es als erstes oder letztes Zeichen platziert wird (z. B.[-a]oder[a-]), passt es auf ein literales'-'.Sonderzeichen außer dem Backslash verlieren ihre Sonderbedeutung innerhalb von Mengen. Zum Beispiel passt
[(+*)]auf jedes der literalen Zeichen'(','+','*'oder')'.
Ein Backslash escapet entweder Zeichen, die in einer Menge eine Sonderbedeutung haben, wie
'-',']','^'und'\\'selbst, oder signalisiert eine Sondersequenz, die ein einzelnes Zeichen darstellt, wie\xa0oder\n, oder eine Zeichenklasse, wie\woder\S(weiter unten definiert). Beachten Sie, dass\bein einzelnes "Backspace"-Zeichen darstellt, nicht eine Wortgrenze wie außerhalb einer Menge, und numerische Escapes wie\1immer Oktal-Escapes sind, keine Gruppenreferenzen. Sondersequenzen, die kein einzelnes Zeichen abgleichen, wie\Aund\z, sind nicht erlaubt.
Zeichen, die nicht innerhalb eines Bereichs liegen, können durch Komplementierung der Menge abgeglichen werden. Wenn das erste Zeichen der Menge
'^'ist, werden alle Zeichen abgeglichen, die nicht in der Menge enthalten sind. Zum Beispiel passt[^5]auf jedes Zeichen außer'5', und[^^]passt auf jedes Zeichen außer'^'.^hat keine Sonderbedeutung, wenn es nicht das erste Zeichen in der Menge ist.Um einen literalen
']'innerhalb einer Menge abzugleichen, stellen Sie ihm einen Backslash voran oder platzieren Sie ihn am Anfang der Menge. Zum Beispiel passen sowohl[()[\]{}]als auch[]()[{}]auf eine rechte Klammer sowie eine linke Klammer, geschweifte Klammern und runde Klammern.
Die Unterstützung für verschachtelte Mengen und Mengenoperationen gemäß Unicode Technical Standard #18 könnte in Zukunft hinzugefügt werden. Dies würde die Syntax ändern, daher wird zur Erleichterung dieser Änderung vorerst eine
FutureWarningin mehrdeutigen Fällen ausgelöst. Dazu gehören Mengen, die mit einem literalen'['beginnen oder literale Zeichenfolgen'--','&&','~~'und'||'enthalten. Um eine Warnung zu vermeiden, escapen Sie diese mit einem Backslash.
Geändert in Version 3.7:
FutureWarningwird ausgelöst, wenn eine Zeichenmenge Konstrukte enthält, die sich in Zukunft semantisch ändern werden.
|A|B, wobei A und B beliebige REs sein können, erstellt einen regulären Ausdruck, der entweder A oder B abgleicht. Eine beliebige Anzahl von REs kann auf diese Weise durch'|'getrennt werden. Dies kann auch innerhalb von Gruppen (siehe unten) verwendet werden. Wenn die Zielzeichenkette durchsucht wird, werden die durch'|'getrennten REs von links nach rechts ausprobiert. Wenn ein Muster vollständig passt, wird dieser Zweig akzeptiert. Das bedeutet, dass, sobald A passt, B nicht weiter getestet wird, selbst wenn es einen längeren Gesamtmatch ergeben würde. Mit anderen Worten, der Operator'|'ist niemals gierig. Um ein literales'|'abzugleichen, verwenden Sie\|oder schließen Sie es in eine Zeichenmenge ein, wie in[|].
(...)Gleicht den regulären Ausdruck ab, der sich in den Klammern befindet, und kennzeichnet den Anfang und das Ende einer Gruppe; der Inhalt einer Gruppe kann nach einem erfolgreichen Abgleich abgerufen und später in der Zeichenkette mit der unten beschriebenen Sondersequenz
\numberabgeglichen werden. Um die literalen Zeichen'('oder')'abzugleichen, verwenden Sie\(oder\), oder schließen Sie sie in eine Zeichenmenge ein:[(],[)].
(?...)Dies ist eine Erweiterungssyntax (ein
'?'nach einem'('ist sonst nicht aussagekräftig). Das erste Zeichen nach dem'?'bestimmt die Bedeutung und weitere Syntax des Konstrukts. Erweiterungen erstellen normalerweise keine neue Gruppe;(?P<name>...)ist die einzige Ausnahme von dieser Regel. Nachfolgend sind die derzeit unterstützten Erweiterungen aufgeführt.(?aiLmsux)(Ein oder mehrere Buchstaben aus der Menge
'a','i','L','m','s','u','x'.) Die Gruppe gleicht die leere Zeichenkette ab; die Buchstaben setzen die entsprechenden Flags für den gesamten regulären Ausdruckre.A(nur ASCII-Abgleich)re.I(Groß-/Kleinschreibung ignorieren)re.L(lokal abhängig)re.M(mehrzeilig)re.S(Punkt entspricht allem)re.U(Unicode-Abgleich)re.X(verbose)
(Die Flags werden in Modulinhalte beschrieben.) Dies ist nützlich, wenn Sie die Flags als Teil des regulären Ausdrucks aufnehmen möchten, anstatt ein flag-Argument an die Funktion
re.compile()zu übergeben. Flags sollten zuerst in der Ausdruckszeichenkette verwendet werden.Geändert in Version 3.11: Diese Konstruktion kann nur am Anfang des Ausdrucks verwendet werden.
(?:...)Eine nicht-erfassende Version von regulären Klammern. Gleicht den regulären Ausdruck ab, der sich in den Klammern befindet, aber die von der Gruppe abgeglichene Teilzeichenkette kann nach Ausführung eines Abgleichs *nicht* abgerufen oder später im Muster referenziert werden.
(?aiLmsux-imsx:...)(Null oder mehr Buchstaben aus der Menge
'a','i','L','m','s','u','x', optional gefolgt von'-'gefolgt von einem oder mehreren Buchstaben aus'i','m','s','x'.) Die Buchstaben setzen oder entfernen die entsprechenden Flags für den Teil des Ausdrucksre.A(nur ASCII-Abgleich)re.I(Groß-/Kleinschreibung ignorieren)re.L(lokal abhängig)re.M(mehrzeilig)re.S(Punkt entspricht allem)re.U(Unicode-Abgleich)re.X(verbose)
(Die Flags werden in Modulinhalte beschrieben.)
Die Buchstaben
'a','L'und'u'sind als Inline-Flags gegenseitig ausschließend, daher können sie nicht kombiniert oder'-'folgen. Stattdessen überschreibt einer von ihnen den Abgleichmodus in der umschließenden Gruppe, wenn er in einer Inline-Gruppe vorkommt. In Unicode-Mustern schaltet(?a:...)auf reinen ASCII-Abgleich um, und(?u:...)schaltet auf Unicode-Abgleich (Standard) um. In Bytes-Mustern schaltet(?L:...)auf lokal abhängigen Abgleich um, und(?a:...)schaltet auf reinen ASCII-Abgleich (Standard) um. Diese Überschreibung gilt nur für die enge Inline-Gruppe, und der ursprüngliche Abgleichmodus wird außerhalb der Gruppe wiederhergestellt.Hinzugefügt in Version 3.6.
Geändert in Version 3.7: Die Buchstaben
'a','L'und'u'können auch in einer Gruppe verwendet werden.(?>...)Versucht,
...so abzugleichen, als wäre es ein separates reguläres Ausdrucksmuster, und wenn erfolgreich, wird versucht, den Rest des Musters abzugleichen. Wenn das nachfolgende Muster nicht übereinstimmt, kann der Stack nur bis zu einem Punkt *vor* dem(?>...)zurückgerollt werden, da der Ausdruck, bekannt als atomare Gruppe, sobald er verlassen wurde, alle Stack-Punkte innerhalb von sich selbst verworfen hat. Daher würde(?>.*).nichts abgleichen, da zuerst.*alle möglichen Zeichen abgleichen würde und dann, da nichts mehr abzugleichen ist, der letzte Punkt.nicht übereinstimmen würde. Da keine Stack-Punkte in der atomaren Gruppe gespeichert sind und davor kein Stack-Punkt vorhanden ist, würde der gesamte Ausdruck fehlschlagen.Hinzugefügt in Version 3.11.
(?P<name>...)Ähnlich wie normale Klammern, aber die vom Gruppentreffer übereinstimmende Teilzeichenkette ist über den symbolischen Gruppennamen name zugänglich. Gruppennamen müssen gültige Python-Bezeichner sein, und in
bytes-Mustern dürfen sie nur Bytes im ASCII-Bereich enthalten. Jeder Gruppennamen muss innerhalb eines regulären Ausdrucks nur einmal definiert werden. Eine symbolische Gruppe ist auch eine nummerierte Gruppe, so als ob die Gruppe nicht benannt wäre.Benannte Gruppen können in drei Kontexten referenziert werden. Wenn das Muster
(?P<quote>['"]).*?(?P=quote)ist (d.h. eine Zeichenkette abgleichen, die entweder mit einfachen oder doppelten Anführungszeichen zitiert ist)Kontext der Referenz auf Gruppe „quote“
Möglichkeiten, sie zu referenzieren
im Muster selbst
(?P=quote)(wie gezeigt)\1
bei der Verarbeitung des Trefferobjekts m
m.group('quote')m.end('quote')(usw.)
in einer Zeichenkette, die an das Argument repl von
re.sub()übergeben wird\g<quote>\g<1>\1
Geändert in Version 3.12: In
bytes-Mustern kann der Gruppenname name nur Bytes im ASCII-Bereich (b'\x00'-b'\x7f') enthalten.
(?P=name)Eine Rückreferenz auf eine benannte Gruppe; sie gleicht jeden Text ab, der von der früheren Gruppe namens name abgeglichen wurde.
(?#...)Ein Kommentar; der Inhalt der Klammern wird einfach ignoriert.
(?=...)Passt, wenn
...als nächstes passt, verbraucht aber keine Zeichen aus der Zeichenkette. Dies wird als Lookahead-Assertion bezeichnet. Zum Beispiel gleichtIsaac (?=Asimov)nur dann'Isaac 'ab, wenn ihm'Asimov'folgt.
(?!...)Passt, wenn
...nicht als nächstes passt. Dies ist eine negative Lookahead-Assertion. Zum Beispiel gleichtIsaac (?!Asimov)nur dann'Isaac 'ab, wenn ihm *nicht*'Asimov'folgt.
(?<=...)Passt, wenn die aktuelle Position in der Zeichenkette einem Treffer für
...vorausgeht, der an der aktuellen Position endet. Dies wird als positive Lookbehind-Assertion bezeichnet.(?<=abc)deffindet einen Treffer in'abcdef', da die Lookbehind-Assertion 3 Zeichen zurückspringt und prüft, ob das enthaltene Muster übereinstimmt. Das enthaltene Muster darf nur Zeichenketten einer bestimmten festen Länge abgleichen, d.h.abcodera|bsind erlaubt, abera*unda{3,4}nicht. Beachten Sie, dass Muster, die mit positiven Lookbehind-Assertionen beginnen, nicht am Anfang der durchsuchten Zeichenkette übereinstimmen; Sie möchten wahrscheinlich die Funktionsearch()anstelle der Funktionmatch()verwenden.>>> import re >>> m = re.search('(?<=abc)def', 'abcdef') >>> m.group(0) 'def'
Dieses Beispiel sucht nach einem Wort, das einem Bindestrich folgt
>>> m = re.search(r'(?<=-)\w+', 'spam-egg') >>> m.group(0) 'egg'
Geändert in Version 3.5: Unterstützung für Gruppenreferenzen fester Länge hinzugefügt.
(?<!...)Passt, wenn die aktuelle Position in der Zeichenkette keinem Treffer für
...vorausgeht. Dies ist eine negative Lookbehind-Assertion. Ähnlich wie bei positiven Lookbehind-Assertionen muss das enthaltene Muster nur Zeichenketten einer bestimmten festen Länge abgleichen. Muster, die mit negativen Lookbehind-Assertionen beginnen, können am Anfang der durchsuchten Zeichenkette übereinstimmen.
(?(id/name)ja-muster|nein-muster)Versucht, mit
ja-musterübereinzustimmen, wenn die Gruppe mit der angegebenen id oder dem namen existiert, und mitnein-muster, wenn sie nicht existiert.nein-musterist optional und kann weggelassen werden. Zum Beispiel ist(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)ein schlechtes E-Mail-Muster, das sowohl'<user@host.com>'als auch'user@host.com'abgleicht, aber nicht'<user@host.com'oder'user@host.com>'.Geändert in Version 3.12: Gruppen-id darf nur ASCII-Ziffern enthalten. In
bytes-Mustern darf der Gruppenname name nur Bytes im ASCII-Bereich (b'\x00'-b'\x7f') enthalten.
Die speziellen Sequenzen bestehen aus '\' und einem Zeichen aus der folgenden Liste. Wenn das normale Zeichen keine ASCII-Ziffer oder kein ASCII-Buchstabe ist, dann gleicht der resultierende RE das zweite Zeichen ab. Zum Beispiel gleicht \$ das Zeichen '$' ab.
\numberGleicht den Inhalt der Gruppe mit derselben Nummer ab. Gruppen werden ab 1 nummeriert. Zum Beispiel gleicht
(.+) \1'the the'oder'55 55'ab, aber nicht'thethe'(beachten Sie das Leerzeichen nach der Gruppe). Diese spezielle Sequenz kann nur verwendet werden, um eine der ersten 99 Gruppen abzugleichen. Wenn die erste Ziffer von number 0 ist oder number 3 Oktalziffern lang ist, wird sie nicht als Gruppenreferenz interpretiert, sondern als das Zeichen mit dem Oktalwert number. Innerhalb von'['und']'einer Zeichenklasse werden alle numerischen Escapes als Zeichen behandelt.
\APasst nur am Anfang der Zeichenkette.
\bGleicht die leere Zeichenkette ab, aber nur am Anfang oder Ende eines Wortes. Ein Wort wird als eine Folge von Wortzeichen definiert. Beachten Sie, dass
\bformal als die Grenze zwischen einem\wund einem\WZeichen (oder umgekehrt) oder zwischen\wund dem Anfang oder Ende der Zeichenkette definiert ist. Dies bedeutet, dassr'\bat\b''at','at.','(at)'und'as at ay'abgleicht, aber nicht'attempt'oder'atlas'.Die Standard-Wortzeichen in Unicode (str) Mustern sind Unicode-Alphanumerika und der Unterstrich, dies kann jedoch durch Verwendung des
ASCII-Flags geändert werden. Wortgrenzen werden durch die aktuelle Locale bestimmt, wenn dasLOCALE-Flag verwendet wird.Hinweis
Innerhalb eines Zeichenbereichs repräsentiert
\bdas Backspace-Zeichen, zur Kompatibilität mit Python-Zeichenkettenliteralen.
\BGleicht die leere Zeichenkette ab, aber nur, wenn sie sich *nicht* am Anfang oder Ende eines Wortes befindet. Dies bedeutet, dass
r'at\B''athens','atom','attorney'abgleicht, aber nicht'at','at.'oder'at!'.\Bist das Gegenteil von\b, daher sind Wortzeichen in Unicode (str) Mustern Unicode-Alphanumerika oder der Unterstrich, obwohl dies durch Verwendung desASCII-Flags geändert werden kann. Wortgrenzen werden durch die aktuelle Locale bestimmt, wenn dasLOCALE-Flag verwendet wird.Geändert in Version 3.14:
\Bgleicht jetzt eine leere Eingabezeichenkette ab.
\d- Für Unicode (str) Muster
Gleicht jede Unicode-Dezimalziffer ab (d.h. jedes Zeichen in der Unicode-Zeichenkategorie [Nd]). Dies schließt
[0-9]ein und auch viele andere Ziffernzeichen.Gleicht
[0-9]ab, wenn dasASCII-Flag verwendet wird.- Für 8-Bit (bytes) Muster
Gleicht jede Dezimalziffer im ASCII-Zeichensatz ab; dies ist äquivalent zu
[0-9].
\DGleicht jedes Zeichen ab, das keine Dezimalziffer ist. Dies ist das Gegenteil von
\d.Gleicht
[^0-9]ab, wenn dasASCII-Flag verwendet wird.
\s- Für Unicode (str) Muster
Gleicht Unicode-Leerzeichenzeichen ab (wie definiert durch
str.isspace()). Dies schließt[ \t\n\r\f\v]ein und auch viele andere Zeichen, zum Beispiel die nicht-brechenden Leerzeichen, die in vielen Sprachen typografisch vorgeschrieben sind.Gleicht
[ \t\n\r\f\v]ab, wenn dasASCII-Flag verwendet wird.- Für 8-Bit (bytes) Muster
Gleicht Zeichen ab, die im ASCII-Zeichensatz als Leerzeichen gelten; dies ist äquivalent zu
[ \t\n\r\f\v].
\SGleicht jedes Zeichen ab, das kein Leerzeichen ist. Dies ist das Gegenteil von
\s.Gleicht
[^ \t\n\r\f\v]ab, wenn dasASCII-Flag verwendet wird.
\w- Für Unicode (str) Muster
Gleicht Unicode-Wortzeichen ab; dies schließt alle Unicode-Alphanumerika (wie definiert durch
str.isalnum()) sowie den Unterstrich (_) ein.Gleicht
[a-zA-Z0-9_]ab, wenn dasASCII-Flag verwendet wird.- Für 8-Bit (bytes) Muster
Gleicht Zeichen ab, die im ASCII-Zeichensatz als alphanumerisch gelten; dies ist äquivalent zu
[a-zA-Z0-9_]. Wenn dasLOCALE-Flag verwendet wird, gleicht es Zeichen ab, die in der aktuellen Locale als alphanumerisch gelten, sowie den Unterstrich.
\WGleicht jedes Zeichen ab, das kein Wortzeichen ist. Dies ist das Gegenteil von
\w. Standardmäßig werden Nicht-Unterstrich-Zeichen (_) abgeglichen, für diestr.isalnum()Falsezurückgibt.Gleicht
[^a-zA-Z0-9_]ab, wenn dasASCII-Flag verwendet wird.Wenn das
LOCALE-Flag verwendet wird, gleicht es Zeichen ab, die weder in der aktuellen Locale alphanumerisch sind noch der Unterstrich.
\zPasst nur am Ende der Zeichenkette.
Hinzugefügt in Version 3.14.
\ZDasselbe wie
\z. Zur Kompatibilität mit alten Python-Versionen.
Die meisten Escape-Sequenzen, die von Python-Zeichenkettenliteralen unterstützt werden, werden auch vom Parser für reguläre Ausdrücke akzeptiert
\a \b \f \n
\N \r \t \u
\U \v \x \\
(Beachten Sie, dass \b zur Darstellung von Wortgrenzen verwendet wird und nur innerhalb von Zeichenklassen „Backspace“ bedeutet.)
'\u', '\U' und '\N' Escape-Sequenzen werden nur in Unicode (str) Mustern erkannt. In Bytes-Mustern sind sie Fehler. Unbekannte Escapes von ASCII-Buchstaben sind für die zukünftige Verwendung reserviert und werden als Fehler behandelt.
Oktale Escapes werden in begrenzter Form aufgenommen. Wenn die erste Ziffer eine 0 ist oder wenn es drei Oktalziffern gibt, wird dies als oktale Escape interpretiert. Andernfalls ist es eine Gruppenreferenz. Wie bei Zeichenkettenliteralen sind oktale Escapes immer maximal drei Ziffern lang.
Geändert in Version 3.3: Die Escape-Sequenzen '\u' und '\U' wurden hinzugefügt.
Geändert in Version 3.6: Unbekannte Escapes, die aus '\' und einem ASCII-Buchstaben bestehen, sind nun Fehler.
Geändert in Version 3.8: Die Escape-Sequenz '\N{name}' wurde hinzugefügt. Wie bei Zeichenkettenliteralen expandiert sie zum benannten Unicode-Zeichen (z.B. '\N{EM DASH}').
Modulinhalt¶
Das Modul definiert mehrere Funktionen, Konstanten und eine Ausnahme. Einige der Funktionen sind vereinfachte Versionen der voll ausgestatteten Methoden für kompilierte reguläre Ausdrücke. Die meisten nicht-trivialen Anwendungen verwenden immer die kompilierte Form.
Flags¶
Geändert in Version 3.6: Flag-Konstanten sind jetzt Instanzen von RegexFlag, einer Unterklasse von enum.IntFlag.
- class re.RegexFlag¶
Eine
enum.IntFlag-Klasse, die die unten aufgeführten Regex-Optionen enthält.Hinzugefügt in Version 3.11: - zu
__all__hinzugefügt
- re.A¶
- re.ASCII¶
Bewirkt, dass
\w,\W,\b,\B,\d,\D,\sund\Snur ASCII-Abgleiche durchführen, anstatt vollständige Unicode-Abgleiche. Dies ist nur für Unicode (str) Muster aussagekräftig und wird für Bytes-Muster ignoriert.Entspricht dem Inline-Flag
(?a).
- re.DEBUG¶
Zeigt Debug-Informationen über den kompilierten Ausdruck an.
Kein entsprechendes Inline-Flag.
- re.I¶
- re.IGNORECASE¶
Führt einen nicht beachtenden Groß-/Kleinschreibung-Abgleich durch; Ausdrücke wie
[A-Z]gleichen auch Kleinbuchstaben ab. Vollständiger Unicode-Abgleich (wieÜmitü) funktioniert ebenfalls, es sei denn, dasASCII-Flag wird verwendet, um Nicht-ASCII-Abgleiche zu deaktivieren. Die aktuelle Locale ändert die Wirkung dieses Flags nicht, es sei denn, dasLOCALE-Flag wird ebenfalls verwendet.Entspricht dem Inline-Flag
(?i).Beachten Sie, dass bei Verwendung der Unicode-Muster
[a-z]oder[A-Z]in Kombination mit demIGNORECASE-Flag die 52 ASCII-Buchstaben und 4 zusätzliche Nicht-ASCII-Buchstaben abgeglichen werden: „İ“ (U+0130, Latin Capital Letter I with dot above), „ı“ (U+0131, Latin Small Letter dotless i), „ſ“ (U+017F, Latin Small Letter long s) und „K“ (U+212A, Kelvin sign). Wenn dasASCII-Flag verwendet wird, werden nur die Buchstaben „a“ bis „z“ und „A“ bis „Z“ abgeglichen.
- re.L¶
- re.LOCALE¶
Bewirkt, dass
\w,\W,\b,\Bund der nicht beachtende Groß-/Kleinschreibung-Abgleich von der aktuellen Locale abhängen. Dieses Flag kann nur mit Bytes-Mustern verwendet werden.Entspricht dem Inline-Flag
(?L).Warnung
Dieses Flag wird nicht empfohlen; erwägen Sie stattdessen Unicode-Abgleiche. Der Locale-Mechanismus ist sehr unzuverlässig, da er nur eine „Kultur“ gleichzeitig behandelt und nur mit 8-Bit-Locales funktioniert. Unicode-Abgleiche sind standardmäßig für Unicode (str) Muster aktiviert und können verschiedene Locales und Sprachen verarbeiten.
Geändert in Version 3.6:
LOCALEkann nur mit Bytes-Mustern verwendet werden und ist nicht mitASCIIkompatibel.Geändert in Version 3.7: Kompilierte reguläre Ausdrucksobjekte mit dem
LOCALE-Flag hängen nicht mehr von der Locale zur Kompilierungszeit ab. Nur die Locale zur Abgleichzeit beeinflusst das Ergebnis des Abgleichs.
- re.M¶
- re.MULTILINE¶
Wenn angegeben, gleicht das Musterzeichen
'^'am Anfang der Zeichenkette und am Anfang jeder Zeile (unmittelbar nach jedem Zeilenumbruch) ab; und das Musterzeichen'$'gleicht am Ende der Zeichenkette und am Ende jeder Zeile (unmittelbar vor jedem Zeilenumbruch) ab. Standardmäßig gleicht'^'nur am Anfang der Zeichenkette ab, und'$'nur am Ende der Zeichenkette und unmittelbar vor dem Zeilenumbruch (falls vorhanden) am Ende der Zeichenkette.Entspricht dem Inline-Flag
(?m).
- re.NOFLAG¶
Zeigt an, dass kein Flag angewendet wird, der Wert ist
0. Dieses Flag kann als Standardwert für ein Funktionsargument oder als Basiswert verwendet werden, der bedingt mit anderen Flags mit bitweisem ODER (dem Operator|) verknüpft wird. Beispiel für die Verwendung als Standardwertdef myfunc(text, flag=re.NOFLAG): return re.match(text, flag)
Hinzugefügt in Version 3.11.
- re.S¶
- re.DOTALL¶
Bewirkt, dass das Sonderzeichen
'.'jedes Zeichen abgleicht, einschließlich eines Zeilenumbruchs; ohne dieses Flag gleicht'.'alles ab, *außer* einem Zeilenumbruch.Entspricht dem Inline-Flag
(?s).
- re.U¶
- re.UNICODE¶
In Python 3 werden Unicode-Zeichen für
str-Muster standardmäßig abgeglichen. Dieses Flag ist daher redundant und hat **keine Auswirkung** und wird nur aus Kompatibilitätsgründen beibehalten.Siehe
ASCII, um stattdessen den Abgleich auf ASCII-Zeichen zu beschränken.
- re.X¶
- re.VERBOSE¶
Dieses Flag ermöglicht es Ihnen, reguläre Ausdrücke zu schreiben, die besser aussehen und lesbarer sind, indem Sie logische Abschnitte des Musters visuell trennen und Kommentare hinzufügen können. Leerzeichen innerhalb des Musters werden ignoriert, außer wenn sie sich in einer Zeichenklasse befinden oder von einem nicht maskierten Backslash gefolgt werden, oder innerhalb von Token wie
*?,(?:oder(?P<...>. Zum Beispiel sind(? :und* ?nicht erlaubt. Wenn eine Zeile ein#enthält, das sich nicht in einer Zeichenklasse befindet und nicht von einem nicht maskierten Backslash gefolgt wird, werden alle Zeichen von diesem linken#bis zum Ende der Zeile ignoriert.Dies bedeutet, dass die folgenden beiden regulären Ausdrucksobjekte, die eine Dezimalzahl abgleichen, funktional gleichwertig sind
a = re.compile(r"""\d + # the integral part \. # the decimal point \d * # some fractional digits""", re.X) b = re.compile(r"\d+\.\d*")
Entspricht dem Inline-Flag
(?x).
Funktionen¶
- re.compile(pattern, flags=0)¶
Kompiliert ein reguläres Ausdrucksmuster in ein reguläres Ausdrucksobjekt, das zum Abgleichen unter Verwendung seiner
match(),search()und anderer unten beschriebener Methoden verwendet werden kann.Das Verhalten des Ausdrucks kann durch Angabe eines flags-Wertes modifiziert werden. Werte können beliebige der flags Variablen sein, kombiniert mit bitweisem ODER (dem
|Operator).Die Sequenz
prog = re.compile(pattern) result = prog.match(string)
gleichbedeutend ist mit
result = re.match(pattern, string)
aber die Verwendung von
re.compile()und das Speichern des resultierenden regulären Ausdrucksobjekts zur Wiederverwendung ist effizienter, wenn der Ausdruck mehrmals in einem einzelnen Programm verwendet wird.Hinweis
Die kompilierten Versionen der zuletzt an
re.compile()und die modulweiten Abgleichfunktionen übergebenen Muster werden zwischengespeichert, sodass Programme, die nur wenige reguläre Ausdrücke gleichzeitig verwenden, sich keine Gedanken über das Kompilieren von regulären Ausdrücken machen müssen.
- re.search(pattern, string, flags=0)¶
Durchsucht string nach der ersten Position, an der der reguläre Ausdruck pattern eine Übereinstimmung ergibt, und gibt ein entsprechendes
Match-Objekt zurück. GibtNonezurück, wenn keine Position in der Zeichenkette dem Muster entspricht. Beachten Sie, dass dies anders ist als das Finden einer null-längen Übereinstimmung an einer bestimmten Stelle in der Zeichenkette.Das Verhalten des Ausdrucks kann durch Angabe eines flags-Wertes modifiziert werden. Werte können beliebige der flags Variablen sein, kombiniert mit bitweisem ODER (dem
|Operator).
- re.match(pattern, string, flags=0)¶
Wenn null oder mehr Zeichen am Anfang von string mit dem regulären Ausdruck pattern übereinstimmen, wird ein entsprechendes
Match-Objekt zurückgegeben. GibtNonezurück, wenn die Zeichenkette nicht mit dem Muster übereinstimmt. Beachten Sie, dass dies anders ist als eine Übereinstimmung mit null Länge.Beachten Sie, dass
re.match(), auch imMULTILINE-Modus, nur am Anfang der Zeichenkette und nicht am Anfang jeder Zeile übereinstimmt.Wenn Sie eine Übereinstimmung irgendwo in string finden möchten, verwenden Sie stattdessen
search()(siehe auch search() vs. match()).Das Verhalten des Ausdrucks kann durch Angabe eines flags-Wertes modifiziert werden. Werte können beliebige der flags Variablen sein, kombiniert mit bitweisem ODER (dem
|Operator).
- re.fullmatch(pattern, string, flags=0)¶
Wenn die gesamte string mit dem regulären Ausdruck pattern übereinstimmt, wird ein entsprechendes
Match-Objekt zurückgegeben. GibtNonezurück, wenn die Zeichenkette nicht mit dem Muster übereinstimmt. Beachten Sie, dass dies anders ist als eine Übereinstimmung mit null Länge.Das Verhalten des Ausdrucks kann durch Angabe eines flags-Wertes modifiziert werden. Werte können beliebige der flags Variablen sein, kombiniert mit bitweisem ODER (dem
|Operator).Hinzugefügt in Version 3.4.
- re.split(pattern, string, maxsplit=0, flags=0)¶
Teilt string an den Vorkommen von pattern auf. Wenn Klammern im pattern verwendet werden, werden die Texte aller Gruppen im Muster ebenfalls als Teil der resultierenden Liste zurückgegeben. Wenn maxsplit ungleich null ist, werden höchstens maxsplit Teilungen durchgeführt, und der Rest der Zeichenkette wird als letztes Element der Liste zurückgegeben.
>>> re.split(r'\W+', 'Words, words, words.') ['Words', 'words', 'words', ''] >>> re.split(r'(\W+)', 'Words, words, words.') ['Words', ', ', 'words', ', ', 'words', '.', ''] >>> re.split(r'\W+', 'Words, words, words.', maxsplit=1) ['Words', 'words, words.'] >>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE) ['0', '3', '9']
Wenn es erfassende Gruppen im Trennzeichen gibt und diese am Anfang der Zeichenkette übereinstimmen, beginnt das Ergebnis mit einer leeren Zeichenkette. Dasselbe gilt für das Ende der Zeichenkette.
>>> re.split(r'(\W+)', '...words, words...') ['', '...', 'words', ', ', 'words', '...', '']
Auf diese Weise werden Trennzeichenkomponenten immer an denselben relativen Indizes innerhalb der Ergebnisliste gefunden.
Angrenzende leere Übereinstimmungen sind nicht möglich, aber eine leere Übereinstimmung kann unmittelbar nach einer nicht-leeren Übereinstimmung auftreten.
>>> re.split(r'\b', 'Words, words, words.') ['', 'Words', ', ', 'words', ', ', 'words', '.'] >>> re.split(r'\W*', '...words...') ['', '', 'w', 'o', 'r', 'd', 's', '', ''] >>> re.split(r'(\W*)', '...words...') ['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', '']
Das Verhalten des Ausdrucks kann durch Angabe eines flags-Wertes modifiziert werden. Werte können beliebige der flags Variablen sein, kombiniert mit bitweisem ODER (dem
|Operator).Geändert in Version 3.1: Das optionale Argument flags wurde hinzugefügt.
Geändert in Version 3.7: Unterstützung für das Aufteilen nach einem Muster, das eine leere Zeichenkette ergeben kann, hinzugefügt.
Veraltet seit Version 3.13: Das Übergeben von maxsplit und flags als positionelle Argumente ist veraltet. In zukünftigen Python-Versionen werden dies keyword-only Parameter sein.
- re.findall(pattern, string, flags=0)¶
Gibt alle nicht überlappenden Übereinstimmungen von pattern in string als Liste von Zeichenketten oder Tupeln zurück. string wird von links nach rechts durchsucht, und Übereinstimmungen werden in der Reihenfolge ihres Auftretens zurückgegeben. Leere Übereinstimmungen sind im Ergebnis enthalten.
Das Ergebnis hängt von der Anzahl der erfassenden Gruppen im Muster ab. Wenn es keine Gruppen gibt, wird eine Liste von Zeichenketten zurückgegeben, die dem gesamten Muster entsprechen. Wenn es genau eine Gruppe gibt, wird eine Liste von Zeichenketten zurückgegeben, die dieser Gruppe entsprechen. Wenn mehrere Gruppen vorhanden sind, wird eine Liste von Tupeln von Zeichenketten zurückgegeben, die den Gruppen entsprechen. Nicht-erfassende Gruppen beeinflussen die Form des Ergebnisses nicht.
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest') ['foot', 'fell', 'fastest'] >>> re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10') [('width', '20'), ('height', '10')]
Das Verhalten des Ausdrucks kann durch Angabe eines flags-Wertes modifiziert werden. Werte können beliebige der flags Variablen sein, kombiniert mit bitweisem ODER (dem
|Operator).Geändert in Version 3.7: Nicht-leere Übereinstimmungen können nun unmittelbar nach einer vorherigen leeren Übereinstimmung beginnen.
- re.finditer(pattern, string, flags=0)¶
Gibt einen Iterator zurück, der
Match-Objekte für alle nicht überlappenden Übereinstimmungen des RE pattern in string liefert. string wird von links nach rechts durchsucht, und Übereinstimmungen werden in der Reihenfolge ihres Auftretens zurückgegeben. Leere Übereinstimmungen sind im Ergebnis enthalten.Das Verhalten des Ausdrucks kann durch Angabe eines flags-Wertes modifiziert werden. Werte können beliebige der flags Variablen sein, kombiniert mit bitweisem ODER (dem
|Operator).Geändert in Version 3.7: Nicht-leere Übereinstimmungen können nun unmittelbar nach einer vorherigen leeren Übereinstimmung beginnen.
- re.sub(pattern, repl, string, count=0, flags=0)¶
Gibt die Zeichenkette zurück, die durch Ersetzen der am weitesten links liegenden nicht überlappenden Vorkommen von pattern in string durch den Ersatz repl erzielt wird. Wenn das Muster nicht gefunden wird, wird string unverändert zurückgegeben. repl kann eine Zeichenkette oder eine Funktion sein; wenn es eine Zeichenkette ist, werden alle Backslash-Escapes darin verarbeitet. Das heißt,
\nwird in ein einzelnes Zeilenumbruchzeichen umgewandelt,\rin einen Wagenrücklauf und so weiter. Unbekannte Escapes von ASCII-Buchstaben sind für zukünftige Verwendung reserviert und werden als Fehler behandelt. Andere unbekannte Escapes wie\&bleiben unverändert. Backreferences wie\6werden durch die von Gruppe 6 im Muster übereinstimmende Teilzeichenkette ersetzt. Zum Beispiel>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):', ... r'static PyObject*\npy_\1(void)\n{', ... 'def myfunc():') 'static PyObject*\npy_myfunc(void)\n{'
Wenn repl eine Funktion ist, wird sie für jedes nicht überlappende Vorkommen von pattern aufgerufen. Die Funktion nimmt ein einzelnes
Match-Argument und gibt die Ersatzzeichenkette zurück. Zum Beispiel>>> def dashrepl(matchobj): ... if matchobj.group(0) == '-': return ' ' ... else: return '-' ... >>> re.sub('-{1,2}', dashrepl, 'pro----gram-files') 'pro--gram files' >>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE) 'Baked Beans & Spam'
Das Muster kann eine Zeichenkette oder ein
Patternsein.Das optionale Argument count ist die maximale Anzahl der zu ersetzenden Muster-Vorkommen; count muss eine nicht-negative ganze Zahl sein. Wenn es weggelassen wird oder null ist, werden alle Vorkommen ersetzt.
Angrenzende leere Übereinstimmungen sind nicht möglich, aber eine leere Übereinstimmung kann unmittelbar nach einer nicht-leeren Übereinstimmung auftreten. Infolgedessen gibt
sub('x*', '-', 'abxd')'-a-b--d-'anstelle von'-a-b-d-'zurück.In repl-Argumenten vom Typ Zeichenkette werden zusätzlich zu den oben beschriebenen Zeichen-Escapes und Backreferences
\g<name>verwendet, um die von der Gruppe mit dem Namennameübereinstimmende Teilzeichenkette zu verwenden, wie sie durch die Syntax(?P<name>...)definiert ist.\g<number>verwendet die entsprechende Gruppennummer;\g<2>ist daher äquivalent zu\2, ist aber in einer Ersetzung wie\g<2>0nicht mehrdeutig.\20würde als Referenz auf Gruppe 20 interpretiert werden, nicht als Referenz auf Gruppe 2 gefolgt vom literalen Zeichen'0'. Die Backreference\g<0>substituiert die gesamte vom RE übereinstimmende Teilzeichenkette.Das Verhalten des Ausdrucks kann durch Angabe eines flags-Wertes modifiziert werden. Werte können beliebige der flags Variablen sein, kombiniert mit bitweisem ODER (dem
|Operator).Geändert in Version 3.1: Das optionale Argument flags wurde hinzugefügt.
Geändert in Version 3.5: Nicht übereinstimmende Gruppen werden durch eine leere Zeichenkette ersetzt.
Geändert in Version 3.6: Unbekannte Escapes in pattern, die aus
'\'und einem ASCII-Buchstaben bestehen, sind nun Fehler.Geändert in Version 3.7: Unbekannte Escapes in repl, die aus
'\'und einem ASCII-Buchstaben bestehen, sind nun Fehler. Eine leere Übereinstimmung kann unmittelbar nach einer nicht-leeren Übereinstimmung auftreten.Geändert in Version 3.12: Gruppen-id dürfen nur ASCII-Ziffern enthalten. In
bytes-Ersetzungszeichenketten darf der Gruppen-name nur Bytes im ASCII-Bereich (b'\x00'-b'\x7f') enthalten.Veraltet seit Version 3.13: Das Übergeben von count und flags als positionelle Argumente ist veraltet. In zukünftigen Python-Versionen werden dies keyword-only Parameter sein.
- re.subn(pattern, repl, string, count=0, flags=0)¶
Führt dieselbe Operation wie
sub()durch, gibt aber ein Tupel(new_string, number_of_subs_made)zurück.Das Verhalten des Ausdrucks kann durch Angabe eines flags-Wertes modifiziert werden. Werte können beliebige der flags Variablen sein, kombiniert mit bitweisem ODER (dem
|Operator).
- re.escape(pattern)¶
Maskiert Sonderzeichen in pattern. Dies ist nützlich, wenn Sie eine beliebige literale Zeichenkette abgleichen möchten, die möglicherweise reguläre Ausdrucks-Metazeichen enthält. Zum Beispiel
>>> print(re.escape('https://pythonlang.de')) https://www\.python\.org >>> legal_chars = string.ascii_lowercase + string.digits + "!#$%&'*+-.^_`|~:" >>> print('[%s]+' % re.escape(legal_chars)) [abcdefghijklmnopqrstuvwxyz0123456789!\#\$%\&'\*\+\-\.\^_`\|\~:]+ >>> operators = ['+', '-', '*', '/', '**'] >>> print('|'.join(map(re.escape, sorted(operators, reverse=True)))) /|\-|\+|\*\*|\*
Diese Funktion darf nicht für die Ersatzzeichenkette in
sub()undsubn()verwendet werden, nur Backslashes sollten maskiert werden. Zum Beispiel>>> digits_re = r'\d+' >>> sample = '/usr/sbin/sendmail - 0 errors, 12 warnings' >>> print(re.sub(digits_re, digits_re.replace('\\', r'\\'), sample)) /usr/sbin/sendmail - \d+ errors, \d+ warnings
Geändert in Version 3.3: Das Zeichen
'_'wird nicht mehr maskiert.Geändert in Version 3.7: Nur Zeichen, die in einem regulären Ausdruck eine Sonderbedeutung haben können, werden maskiert. Infolgedessen werden
'!','"','%',"'",',','/',':',';','<','=','>','@'und"`"nicht mehr maskiert.
- re.purge()¶
Löscht den Cache für reguläre Ausdrücke.
Ausnahmen¶
- exception re.PatternError(msg, pattern=None, pos=None)¶
Ausnahme, die ausgelöst wird, wenn eine an eine der Funktionen übergebene Zeichenkette kein gültiger regulärer Ausdruck ist (z. B. nicht übereinstimmende Klammern enthalten kann) oder wenn während der Kompilierung oder des Abgleichs ein anderer Fehler auftritt. Es ist niemals ein Fehler, wenn eine Zeichenkette keine Übereinstimmung mit einem Muster enthält. Die Instanz
PatternErrorhat die folgenden zusätzlichen Attribute- msg¶
Die ungeformatierte Fehlermeldung.
- pattern¶
Das Muster des regulären Ausdrucks.
- pos¶
Der Index in pattern, an dem die Kompilierung fehlgeschlagen ist (kann
Nonesein).
- lineno¶
Die Zeile, die pos entspricht (kann
Nonesein).
- colno¶
Die Spalte, die pos entspricht (kann
Nonesein).
Geändert in Version 3.5: Zusätzliche Attribute hinzugefügt.
Geändert in Version 3.13:
PatternErrorhieß ursprünglicherror; letzteres bleibt als Alias für Abwärtskompatibilität erhalten.
Objekte für reguläre Ausdrücke¶
- class re.Pattern¶
Kompiliertes Objekt eines regulären Ausdrucks, das von
re.compile()zurückgegeben wird.Geändert in Version 3.9:
re.Patternunterstützt[], um ein Unicode-Muster (str) oder Byte-Muster anzuzeigen. Siehe Generischer Alias-Typ.
- Pattern.search(string[, pos[, endpos]])¶
Durchsucht string nach der ersten Position, an der dieser reguläre Ausdruck eine Übereinstimmung ergibt, und gibt ein entsprechendes
Match-Objekt zurück. GibtNonezurück, wenn keine Position in der Zeichenkette dem Muster entspricht. Beachten Sie, dass dies anders ist als das Finden einer null-längen Übereinstimmung an einer bestimmten Stelle in der Zeichenkette.Der optionale zweite Parameter pos gibt einen Index in der Zeichenkette an, an dem die Suche beginnen soll; er standardmäßig auf
0. Dies ist nicht vollständig äquivalent zum Slicing der Zeichenkette; das Musterzeichen'^'stimmt am tatsächlichen Anfang der Zeichenkette und an Positionen unmittelbar nach einem Zeilenumbruch überein, aber nicht unbedingt am Index, an dem die Suche beginnen soll.Der optionale Parameter endpos begrenzt, wie weit die Zeichenkette durchsucht wird; es wird so sein, als wäre die Zeichenkette endpos Zeichen lang, so dass nur die Zeichen von pos bis
endpos - 1auf eine Übereinstimmung durchsucht werden. Wenn endpos kleiner als pos ist, wird keine Übereinstimmung gefunden; andernfalls ist, wenn rx ein kompiliertes Objekt eines regulären Ausdrucks ist,rx.search(string, 0, 50)äquivalent zurx.search(string[:50], 0).>>> pattern = re.compile("d") >>> pattern.search("dog") # Match at index 0 <re.Match object; span=(0, 1), match='d'> >>> pattern.search("dog", 1) # No match; search doesn't include the "d"
- Pattern.match(string[, pos[, endpos]])¶
Wenn null oder mehr Zeichen am *Anfang* von string mit diesem regulären Ausdruck übereinstimmen, wird ein entsprechendes
Match-Objekt zurückgegeben. GibtNonezurück, wenn die Zeichenkette nicht mit dem Muster übereinstimmt. Beachten Sie, dass dies anders ist als eine Übereinstimmung mit null Länge.Die optionalen Parameter pos und endpos haben dieselbe Bedeutung wie in der Methode
search().>>> pattern = re.compile("o") >>> pattern.match("dog") # No match as "o" is not at the start of "dog". >>> pattern.match("dog", 1) # Match as "o" is the 2nd character of "dog". <re.Match object; span=(1, 2), match='o'>
Wenn Sie eine Übereinstimmung irgendwo in string finden möchten, verwenden Sie stattdessen
search()(siehe auch search() vs. match()).
- Pattern.fullmatch(string[, pos[, endpos]])¶
Wenn die gesamte string mit diesem regulären Ausdruck übereinstimmt, wird ein entsprechendes
Match-Objekt zurückgegeben. GibtNonezurück, wenn die Zeichenkette nicht mit dem Muster übereinstimmt. Beachten Sie, dass dies anders ist als eine Übereinstimmung mit null Länge.Die optionalen Parameter pos und endpos haben dieselbe Bedeutung wie in der Methode
search().>>> pattern = re.compile("o[gh]") >>> pattern.fullmatch("dog") # No match as "o" is not at the start of "dog". >>> pattern.fullmatch("ogre") # No match as not the full string matches. >>> pattern.fullmatch("doggie", 1, 3) # Matches within given limits. <re.Match object; span=(1, 3), match='og'>
Hinzugefügt in Version 3.4.
- Pattern.split(string, maxsplit=0)¶
Identisch mit der Funktion
split(), unter Verwendung des kompilierten Musters.
- Pattern.findall(string[, pos[, endpos]])¶
Ähnlich wie die Funktion
findall(), unter Verwendung des kompilierten Musters, akzeptiert aber auch optionale Parameter pos und endpos, die den Suchbereich wie beisearch()begrenzen.
- Pattern.finditer(string[, pos[, endpos]])¶
Ähnlich wie die Funktion
finditer(), unter Verwendung des kompilierten Musters, akzeptiert aber auch optionale Parameter pos und endpos, die den Suchbereich wie beisearch()begrenzen.
- Pattern.sub(repl, string, count=0)¶
Identisch mit der Funktion
sub(), unter Verwendung des kompilierten Musters.
- Pattern.subn(repl, string, count=0)¶
Identisch mit der Funktion
subn(), unter Verwendung des kompilierten Musters.
- Pattern.flags¶
Die Flags für den Regex-Abgleich. Dies ist eine Kombination aus den an
compile()übergebenen Flags, allen Inline-Flags(?...)im Muster und impliziten Flags wieUNICODE, wenn das Muster eine Unicode-Zeichenkette ist.
- Pattern.groups¶
Die Anzahl der erfassenden Gruppen im Muster.
- Pattern.groupindex¶
Ein Wörterbuch, das alle symbolischen Gruppennamen, die durch
(?P<id>)definiert sind, auf Gruppennummern abbildet. Das Wörterbuch ist leer, wenn keine symbolischen Gruppen im Muster verwendet wurden.
- Pattern.pattern¶
Die Musterzeichenkette, aus der das Musterobjekt kompiliert wurde.
Geändert in Version 3.7: Unterstützung für copy.copy() und copy.deepcopy() hinzugefügt. Kompilierte Objekte regulärer Ausdrücke werden als atomar betrachtet.
Match-Objekte¶
Match-Objekte haben immer einen booleschen Wert von True. Da match() und search() None zurückgeben, wenn keine Übereinstimmung gefunden wurde, können Sie mit einer einfachen if-Anweisung testen, ob eine Übereinstimmung vorlag
match = re.search(pattern, string)
if match:
process(match)
- class re.Match¶
Match-Objekt, das von erfolgreichen `match`- und `search`-Aufrufen zurückgegeben wird.
Geändert in Version 3.9: `re.Match` unterstützt `[]` zur Angabe eines Unicode (str) oder Bytes-Treffers. Siehe Generischer Alias-Typ.
- Match.expand(template)¶
Gibt die Zeichenkette zurück, die durch Rückwärtssubstitutionen im Vorlagen-String template erzielt wird, wie sie von der `sub()`-Methode ausgeführt werden. Escapes wie `\n` werden in die entsprechenden Zeichen umgewandelt, und numerische Rückverweise (`\1`, `\2`) sowie benannte Rückverweise (`\g<1>`, `\g<name>`) werden durch den Inhalt der entsprechenden Gruppe ersetzt. Der Rückverweis `\g<0>` wird durch den gesamten Treffer ersetzt.
Geändert in Version 3.5: Nicht übereinstimmende Gruppen werden durch eine leere Zeichenkette ersetzt.
- Match.group([group1, ...])¶
Gibt eine oder mehrere Untergruppen des Treffers zurück. Wenn ein einzelnes Argument angegeben wird, ist das Ergebnis eine einzelne Zeichenkette; bei mehreren Argumenten ist das Ergebnis ein Tupel mit einem Element pro Argument. Ohne Argumente ist `group1` standardmäßig auf Null gesetzt (der gesamte Treffer wird zurückgegeben). Wenn ein `groupN`-Argument Null ist, ist der entsprechende Rückgabewert die gesamte übereinstimmende Zeichenkette; wenn es sich im inklusiven Bereich [1..99] befindet, ist es die Zeichenkette, die mit der entsprechenden geklammerten Gruppe übereinstimmt. Wenn eine Gruppennummer negativ ist oder größer als die Anzahl der im Muster definierten Gruppen, wird eine `IndexError`-Ausnahme ausgelöst. Wenn eine Gruppe Teil eines Musters ist, das nicht übereinstimmte, ist das entsprechende Ergebnis `None`. Wenn eine Gruppe Teil eines Musters ist, das mehrmals übereinstimmte, wird der letzte Treffer zurückgegeben.
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist") >>> m.group(0) # The entire match 'Isaac Newton' >>> m.group(1) # The first parenthesized subgroup. 'Isaac' >>> m.group(2) # The second parenthesized subgroup. 'Newton' >>> m.group(1, 2) # Multiple arguments give us a tuple. ('Isaac', 'Newton')
Wenn der reguläre Ausdruck die Syntax `(?P<name>...)` verwendet, können die `groupN`-Argumente auch Zeichenketten sein, die Gruppen anhand ihres Gruppennamens identifizieren. Wenn ein Zeichenkettenargument nicht als Gruppenname im Muster verwendet wird, wird eine `IndexError`-Ausnahme ausgelöst.
Ein mäßig kompliziertes Beispiel
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds") >>> m.group('first_name') 'Malcolm' >>> m.group('last_name') 'Reynolds'
Benannte Gruppen können auch durch ihren Index referenziert werden
>>> m.group(1) 'Malcolm' >>> m.group(2) 'Reynolds'
Wenn eine Gruppe mehrmals übereinstimmt, ist nur der letzte Treffer zugänglich
>>> m = re.match(r"(..)+", "a1b2c3") # Matches 3 times. >>> m.group(1) # Returns only the last match. 'c3'
- Match.__getitem__(g)¶
Dies ist identisch mit `m.group(g)`. Dies ermöglicht einen einfacheren Zugriff auf eine einzelne Gruppe aus einem Treffer
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist") >>> m[0] # The entire match 'Isaac Newton' >>> m[1] # The first parenthesized subgroup. 'Isaac' >>> m[2] # The second parenthesized subgroup. 'Newton'
Benannte Gruppen werden ebenfalls unterstützt
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Isaac Newton") >>> m['first_name'] 'Isaac' >>> m['last_name'] 'Newton'
Hinzugefügt in Version 3.6.
- Match.groups(default=None)¶
Gibt ein Tupel zurück, das alle Untergruppen des Treffers von 1 bis zur Anzahl der Gruppen im Muster enthält. Das `default`-Argument wird für Gruppen verwendet, die nicht am Treffer teilgenommen haben; es ist standardmäßig `None`.
Zum Beispiel
>>> m = re.match(r"(\d+)\.(\d+)", "24.1632") >>> m.groups() ('24', '1632')
Wenn wir die Dezimalstelle und alles danach optional machen, nehmen möglicherweise nicht alle Gruppen am Treffer teil. Diese Gruppen haben standardmäßig `None`, es sei denn, das `default`-Argument wird angegeben
>>> m = re.match(r"(\d+)\.?(\d+)?", "24") >>> m.groups() # Second group defaults to None. ('24', None) >>> m.groups('0') # Now, the second group defaults to '0'. ('24', '0')
- Match.groupdict(default=None)¶
Gibt ein Dictionary zurück, das alle *benannten* Untergruppen des Treffers enthält, wobei die Gruppennamen als Schlüssel dienen. Das `default`-Argument wird für Gruppen verwendet, die nicht am Treffer teilgenommen haben; es ist standardmäßig `None`. Zum Beispiel
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds") >>> m.groupdict() {'first_name': 'Malcolm', 'last_name': 'Reynolds'}
- Match.start([group])¶
- Match.end([group])¶
Gibt die Start- und Endindizes des vom `group` übereinstimmenden Teilstrings zurück; `group` ist standardmäßig Null (was bedeutet, dass der gesamte übereinstimmende Teilstring zurückgegeben wird). Gibt `-1` zurück, wenn `group` existiert, aber nicht zum Treffer beigetragen hat. Für ein Match-Objekt `m` und eine Gruppe `g`, die zum Treffer beigetragen hat, ist der von Gruppe `g` übereinstimmende Teilstring (äquivalent zu `m.group(g)`):
m.string[m.start(g):m.end(g)]
Beachten Sie, dass `m.start(group)` gleich `m.end(group)` ist, wenn `group` einen leeren String übereinstimmte. Zum Beispiel, nach `m = re.search('b(c?)', 'cba')`, sind `m.start(0)` 1, `m.end(0)` 2, `m.start(1)` und `m.end(1)` beide 2, und `m.start(2)` löst eine `IndexError`-Ausnahme aus.
Ein Beispiel, das `remove_this` aus E-Mail-Adressen entfernt
>>> email = "tony@tiremove_thisger.net" >>> m = re.search("remove_this", email) >>> email[:m.start()] + email[m.end():] 'tony@tiger.net'
- Match.span([group])¶
Für einen Treffer `m` gibt das 2-Tupel `(m.start(group), m.end(group))` zurück. Beachten Sie, dass dies `(-1, -1)` ist, wenn `group` nicht zum Treffer beigetragen hat. `group` ist standardmäßig Null, der gesamte Treffer.
- Match.pos¶
Der Wert von `pos`, der an die Methode `search()` oder `match()` eines Regex-Objekts übergeben wurde. Dies ist der Index in der Zeichenkette, ab dem die RE-Engine nach einem Treffer zu suchen begann.
- Match.endpos¶
Der Wert von `endpos`, der an die Methode `search()` oder `match()` eines Regex-Objekts übergeben wurde. Dies ist der Index in der Zeichenkette, über den die RE-Engine nicht hinausgehen wird.
- Match.lastindex¶
Der ganzzahlige Index der zuletzt übereinstimmenden erfassenden Gruppe oder `None`, wenn überhaupt keine Gruppe übereinstimmte. Zum Beispiel haben die Ausdrücke `(a)b`, `((a)(b))` und `((ab))` `lastindex == 1`, wenn sie auf die Zeichenkette `'ab'` angewendet werden, während der Ausdruck `(a)(b)` `lastindex == 2` hat, wenn er auf dieselbe Zeichenkette angewendet wird.
- Match.lastgroup¶
Der Name der zuletzt übereinstimmenden erfassenden Gruppe oder `None`, wenn die Gruppe keinen Namen hatte oder wenn überhaupt keine Gruppe übereinstimmte.
- Match.re¶
Das reguläre Ausdrucksobjekt, dessen `match()`- oder `search()`-Methode diese Trefferinstanz erzeugt hat.
- Match.string¶
Die Zeichenkette, die an `match()` oder `search()` übergeben wurde.
Geändert in Version 3.7: Unterstützung für `copy.copy()` und `copy.deepcopy()` hinzugefügt. Match-Objekte gelten als atomar.
Beispiele für reguläre Ausdrücke¶
Überprüfung auf ein Paar¶
In diesem Beispiel verwenden wir die folgende Hilfsfunktion, um Match-Objekte etwas übersichtlicher darzustellen
def displaymatch(match):
if match is None:
return None
return '<Match: %r, groups=%r>' % (match.group(), match.groups())
Angenommen, Sie schreiben ein Pokerspiel, bei dem die Hand eines Spielers als 5-stellige Zeichenkette dargestellt wird, wobei jedes Zeichen eine Karte darstellt: "a" für Ass, "k" für König, "q" für Dame, "j" für Bube, "t" für 10, und "2" bis "9" repräsentieren die Karte mit diesem Wert.
Um zu prüfen, ob eine gegebene Zeichenkette eine gültige Hand ist, könnte man Folgendes tun
>>> valid = re.compile(r"^[a2-9tjqk]{5}$")
>>> displaymatch(valid.match("akt5q")) # Valid.
"<Match: 'akt5q', groups=()>"
>>> displaymatch(valid.match("akt5e")) # Invalid.
>>> displaymatch(valid.match("akt")) # Invalid.
>>> displaymatch(valid.match("727ak")) # Valid.
"<Match: '727ak', groups=()>"
Die letzte Hand, `"727ak"`, enthielt ein Paar, also zwei Karten des gleichen Wertes. Um dies mit einem regulären Ausdruck abzugleichen, könnte man Rückverweise wie folgt verwenden:
>>> pair = re.compile(r".*(.).*\1")
>>> displaymatch(pair.match("717ak")) # Pair of 7s.
"<Match: '717', groups=('7',)>"
>>> displaymatch(pair.match("718ak")) # No pairs.
>>> displaymatch(pair.match("354aa")) # Pair of aces.
"<Match: '354aa', groups=('a',)>"
Um herauszufinden, aus welcher Karte das Paar besteht, könnte man die `group()`-Methode des Match-Objekts wie folgt verwenden:
>>> pair = re.compile(r".*(.).*\1")
>>> pair.match("717ak").group(1)
'7'
# Error because re.match() returns None, which doesn't have a group() method:
>>> pair.match("718ak").group(1)
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
re.match(r".*(.).*\1", "718ak").group(1)
AttributeError: 'NoneType' object has no attribute 'group'
>>> pair.match("354aa").group(1)
'a'
Simulieren von scanf()¶
Python hat derzeit kein Äquivalent zu `scanf()`. Reguläre Ausdrücke sind im Allgemeinen leistungsfähiger, wenn auch ausführlicher, als `scanf()`-Format-Strings. Die folgende Tabelle bietet mehr oder weniger gleichwertige Zuordnungen zwischen `scanf()`-Format-Tokens und regulären Ausdrücken.
|
Regulärer Ausdruck |
|---|---|
|
|
|
|
|
|
`%e`, `%E`, `%f`, `%g` |
|
|
|
|
|
|
|
|
|
`%x`, `%X` |
|
Um den Dateinamen und die Zahlen aus einer Zeichenkette wie
/usr/sbin/sendmail - 0 errors, 4 warnings
würde man ein `scanf()`-Format wie
%s - %d errors, %d warnings
Der entsprechende reguläre Ausdruck wäre
(\S+) - (\d+) errors, (\d+) warnings
search() vs. match()¶
Python bietet verschiedene primitive Operationen basierend auf regulären Ausdrücken
`re.match()` prüft nur am Anfang der Zeichenkette auf einen Treffer
`re.search()` prüft auf einen Treffer irgendwo in der Zeichenkette (das macht Perl standardmäßig)
`re.fullmatch()` prüft, ob die gesamte Zeichenkette ein Treffer ist
Zum Beispiel
>>> re.match("c", "abcdef") # No match
>>> re.search("c", "abcdef") # Match
<re.Match object; span=(2, 3), match='c'>
>>> re.fullmatch("p.*n", "python") # Match
<re.Match object; span=(0, 6), match='python'>
>>> re.fullmatch("r.*n", "python") # No match
Reguläre Ausdrücke, die mit `'^'` beginnen, können mit `search()` verwendet werden, um den Treffer auf den Anfang der Zeichenkette zu beschränken
>>> re.match("c", "abcdef") # No match
>>> re.search("^c", "abcdef") # No match
>>> re.search("^a", "abcdef") # Match
<re.Match object; span=(0, 1), match='a'>
Beachten Sie jedoch, dass im `MULTILINE`-Modus `match()` nur am Anfang der Zeichenkette übereinstimmt, während die Verwendung von `search()` mit einem regulären Ausdruck, der mit `'^'` beginnt, am Anfang jeder Zeile übereinstimmt.
>>> re.match("X", "A\nB\nX", re.MULTILINE) # No match
>>> re.search("^X", "A\nB\nX", re.MULTILINE) # Match
<re.Match object; span=(4, 5), match='X'>
Ein Telefonbuch erstellen¶
`split()` teilt eine Zeichenkette in eine Liste, die durch das übergebene Muster getrennt ist. Die Methode ist unschätzbar wertvoll für die Konvertierung von Textdaten in Datenstrukturen, die von Python leicht gelesen und modifiziert werden können, wie im folgenden Beispiel gezeigt, das ein Telefonbuch erstellt.
Zuerst die Eingabe. Normalerweise könnte sie aus einer Datei stammen, hier verwenden wir die Syntax für dreifach-angeführte Zeichenketten
>>> text = """Ross McFluff: 834.345.1254 155 Elm Street
...
... Ronald Heathmore: 892.345.3428 436 Finley Avenue
... Frank Burger: 925.541.7625 662 South Dogwood Way
...
...
... Heather Albrecht: 548.326.4584 919 Park Place"""
Die Einträge werden durch ein oder mehrere Zeilenumbrüche getrennt. Nun konvertieren wir die Zeichenkette in eine Liste, wobei jede nicht-leere Zeile ihren eigenen Eintrag hat
>>> entries = re.split("\n+", text)
>>> entries
['Ross McFluff: 834.345.1254 155 Elm Street',
'Ronald Heathmore: 892.345.3428 436 Finley Avenue',
'Frank Burger: 925.541.7625 662 South Dogwood Way',
'Heather Albrecht: 548.326.4584 919 Park Place']
Schließlich wird jeder Eintrag in eine Liste mit Vorname, Nachname, Telefonnummer und Adresse aufgeteilt. Wir verwenden den `maxsplit`-Parameter von `split()`, da die Adresse Leerzeichen enthält, unser Trennmuster, darin
>>> [re.split(":? ", entry, maxsplit=3) for entry in entries]
[['Ross', 'McFluff', '834.345.1254', '155 Elm Street'],
['Ronald', 'Heathmore', '892.345.3428', '436 Finley Avenue'],
['Frank', 'Burger', '925.541.7625', '662 South Dogwood Way'],
['Heather', 'Albrecht', '548.326.4584', '919 Park Place']]
Das Muster `:?` passt auf den Doppelpunkt nach dem Nachnamen, sodass er nicht in der Ergebnisliste vorkommt. Mit einem `maxsplit` von `4` könnten wir die Hausnummer vom Straßennamen trennen
>>> [re.split(":? ", entry, maxsplit=4) for entry in entries]
[['Ross', 'McFluff', '834.345.1254', '155', 'Elm Street'],
['Ronald', 'Heathmore', '892.345.3428', '436', 'Finley Avenue'],
['Frank', 'Burger', '925.541.7625', '662', 'South Dogwood Way'],
['Heather', 'Albrecht', '548.326.4584', '919', 'Park Place']]
Textbearbeitung¶
`sub()` ersetzt jedes Vorkommen eines Musters durch eine Zeichenkette oder das Ergebnis einer Funktion. Dieses Beispiel demonstriert die Verwendung von `sub()` mit einer Funktion, um Text zu "bereinigen" oder die Reihenfolge aller Zeichen in jedem Wort eines Satzes außer den ersten und letzten Zeichen zu randomisieren
>>> def repl(m):
... inner_word = list(m.group(2))
... random.shuffle(inner_word)
... return m.group(1) + "".join(inner_word) + m.group(3)
...
>>> text = "Professor Abdolmalek, please report your absences promptly."
>>> re.sub(r"(\w)(\w+)(\w)", repl, text)
'Poefsrosr Aealmlobdk, pslaee reorpt your abnseces plmrptoy.'
>>> re.sub(r"(\w)(\w+)(\w)", repl, text)
'Pofsroser Aodlambelk, plasee reoprt yuor asnebces potlmrpy.'
Alle Adverbien finden¶
`findall()` findet *alle* Vorkommen eines Musters, nicht nur das erste, wie es `search()` tut. Wenn beispielsweise ein Autor alle Adverbien in einem Text finden wollte, könnte er `findall()` wie folgt verwenden:
>>> text = "He was carefully disguised but captured quickly by police."
>>> re.findall(r"\w+ly\b", text)
['carefully', 'quickly']
Alle Adverbien und ihre Positionen finden¶
Wenn man mehr Informationen über alle Treffer eines Musters als den übereinstimmenden Text wünscht, ist `finditer()` nützlich, da es `Match`-Objekte anstelle von Zeichenketten liefert. Weiter mit dem vorherigen Beispiel: Wenn ein Autor alle Adverbien *und ihre Positionen* in einem Text finden wollte, würde er `finditer()` wie folgt verwenden:
>>> text = "He was carefully disguised but captured quickly by police."
>>> for m in re.finditer(r"\w+ly\b", text):
... print('%02d-%02d: %s' % (m.start(), m.end(), m.group(0)))
07-16: carefully
40-47: quickly
Rohe String-Notation¶
Rohe String-Notation (`r"text"`) hält reguläre Ausdrücke übersichtlich. Ohne sie müsste jeder Backslash (`'\'`) in einem regulären Ausdruck mit einem weiteren vorangestellten Backslash escaped werden. Zum Beispiel sind die folgenden beiden Codezeilen funktional identisch
>>> re.match(r"\W(.)\1\W", " ff ")
<re.Match object; span=(0, 4), match=' ff '>
>>> re.match("\\W(.)\\1\\W", " ff ")
<re.Match object; span=(0, 4), match=' ff '>
Wenn man einen literalen Backslash abgleichen möchte, muss er im regulären Ausdruck escaped werden. Mit roher String-Notation bedeutet dies `r"\\"`. Ohne rohe String-Notation muss man `"\\\\"` verwenden, was die folgenden Codezeilen funktional identisch macht
>>> re.match(r"\\", r"\\")
<re.Match object; span=(0, 1), match='\\'>
>>> re.match("\\\\", r"\\")
<re.Match object; span=(0, 1), match='\\'>
Einen Tokenizer schreiben¶
Ein Tokenizer oder Scanner analysiert eine Zeichenkette, um Zeichengruppen zu kategorisieren. Dies ist ein nützlicher erster Schritt beim Schreiben eines Compilers oder Interpreters.
Die Textkategorien werden mit regulären Ausdrücken spezifiziert. Die Technik besteht darin, diese zu einem einzigen Haupt-Regulären Ausdruck zu kombinieren und über successive Treffer zu iterieren
from typing import NamedTuple
import re
class Token(NamedTuple):
type: str
value: str
line: int
column: int
def tokenize(code):
keywords = {'IF', 'THEN', 'ENDIF', 'FOR', 'NEXT', 'GOSUB', 'RETURN'}
token_specification = [
('NUMBER', r'\d+(\.\d*)?'), # Integer or decimal number
('ASSIGN', r':='), # Assignment operator
('END', r';'), # Statement terminator
('ID', r'[A-Za-z]+'), # Identifiers
('OP', r'[+\-*/]'), # Arithmetic operators
('NEWLINE', r'\n'), # Line endings
('SKIP', r'[ \t]+'), # Skip over spaces and tabs
('MISMATCH', r'.'), # Any other character
]
tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification)
line_num = 1
line_start = 0
for mo in re.finditer(tok_regex, code):
kind = mo.lastgroup
value = mo.group()
column = mo.start() - line_start
if kind == 'NUMBER':
value = float(value) if '.' in value else int(value)
elif kind == 'ID' and value in keywords:
kind = value
elif kind == 'NEWLINE':
line_start = mo.end()
line_num += 1
continue
elif kind == 'SKIP':
continue
elif kind == 'MISMATCH':
raise RuntimeError(f'{value!r} unexpected on line {line_num}')
yield Token(kind, value, line_num, column)
statements = '''
IF quantity THEN
total := total + price * quantity;
tax := price * 0.05;
ENDIF;
'''
for token in tokenize(statements):
print(token)
Der Tokenizer erzeugt die folgende Ausgabe
Token(type='IF', value='IF', line=2, column=4)
Token(type='ID', value='quantity', line=2, column=7)
Token(type='THEN', value='THEN', line=2, column=16)
Token(type='ID', value='total', line=3, column=8)
Token(type='ASSIGN', value=':=', line=3, column=14)
Token(type='ID', value='total', line=3, column=17)
Token(type='OP', value='+', line=3, column=23)
Token(type='ID', value='price', line=3, column=25)
Token(type='OP', value='*', line=3, column=31)
Token(type='ID', value='quantity', line=3, column=33)
Token(type='END', value=';', line=3, column=41)
Token(type='ID', value='tax', line=4, column=8)
Token(type='ASSIGN', value=':=', line=4, column=12)
Token(type='ID', value='price', line=4, column=15)
Token(type='OP', value='*', line=4, column=21)
Token(type='NUMBER', value=0.05, line=4, column=23)
Token(type='END', value=';', line=4, column=27)
Token(type='ENDIF', value='ENDIF', line=5, column=4)
Token(type='END', value=';', line=5, column=9)
Friedl, Jeffrey. Mastering Regular Expressions. 3. Aufl., O’Reilly Media, 2009. Die dritte Auflage des Buches behandelt Python nicht mehr, aber die erste Auflage behandelte das Schreiben guter regulärer Ausdrucksmuster im Detail.