Reguläre Ausdrücke in Python
Ein regulärer Ausdruck ist eine spezielle Zeichenfolge, die dabei hilft, einfach zu prüfen, ob eine Zeichenkette einem bestimmten Muster entspricht.
Python hat seit Version 1.5 das re-Modul hinzugefügt, das Perl-artige reguläre Ausdrucksmuster bietet.
Das re-Modul verleiht der Python-Sprache die gesamte Funktionalität regulärer Ausdrücke.
Die compile-Funktion erzeugt anhand einer Musterzeichenfolge und optionaler Flag-Parameter ein reguläres Ausdrucksobjekt. Dieses Objekt verfügt über eine Reihe von Methoden zum Abgleichen und Ersetzen regulärer Ausdrücke.
Das re-Modul bietet auch Funktionen, die vollständig mit der Funktionalität dieser Methoden übereinstimmen. Diese Funktionen verwenden eine Musterzeichenfolge als ersten Parameter.
Dieses Kapitel stellt hauptsächlich die häufig verwendeten Funktionen zur Verarbeitung regulärer Ausdrücke in Python vor.
re.match-Funktion
re.match versucht, ein Muster vom Anfang der Zeichenfolge an abzugleichen. Wenn der Abgleich an der Startposition nicht erfolgreich ist, gibt match() None zurück.
Funktionssyntax:
re.match(pattern, string, flags=0)
Beschreibung der Funktionsparameter:
| Parameter | Beschreibung |
|---|---|
| pattern | Der abzugleichende reguläre Ausdruck. |
| string | Die Zeichenfolge, die abgeglichen werden soll. |
| Flags | Flags, die verwendet werden, um die Abgleichmethode des regulären Ausdrucks zu steuern, wie z. B.: Groß-/Kleinschreibung, mehrzeiliger Abgleich usw. Siehe:Modifikatoren für reguläre Ausdrücke - optionale Flags |
Wenn der Abgleich erfolgreich ist, gibt die Methode re.match ein Match-Objekt zurück, andernfalls gibt sie None zurück.
Wir können die Match-Objekt-Funktionen group(num) oder groups() verwenden, um den abgeglichenen Ausdruck zu erhalten.
| Methoden von Match-Objekten | Beschreibung |
|---|---|
| group(num=0) | Die Zeichenkette des gesamten übereinstimmenden Ausdrucks. group() kann mehrere Gruppennummern gleichzeitig entgegennehmen; in diesem Fall gibt es ein Tupel zurück, das die Werte enthält, die diesen Gruppen entsprechen. |
| groups() | Gibt ein Tupel zurück, das alle Zeichenketten der Untergruppen enthält, von 1 bis zur Anzahl der enthaltenen Untergruppen. |
Beispiel
Die Ausgabe des obigen Beispiels ist:
(0, 3) None
Beispiel
Das Ergebnis des obigen Beispiels ist wie folgt:
matchObj.group() : Cats are smarter than dogs matchObj.group(1) : Cats matchObj.group(2) : smarter
re.search-Methode
re.search durchsucht die gesamte Zeichenkette und gibt die erste erfolgreiche Übereinstimmung zurück.
Funktionssyntax:
re.search(pattern, string, flags=0)
Beschreibung der Funktionsparameter:
| Parameter | Beschreibung |
|---|---|
| pattern | Der abzugleichende reguläre Ausdruck. |
| string | Die Zeichenfolge, die abgeglichen werden soll. |
| Flags | Flags, die verwendet werden, um die Übereinstimmungsmethode des regulären Ausdrucks zu steuern, wie z. B.: Groß-/Kleinschreibung, mehrzeilige Übereinstimmung usw. |
Wenn die Übereinstimmung erfolgreich ist, gibt die Methode re.search ein Übereinstimmungsobjekt zurück, andernfalls gibt sie None zurück.
Wir können die Match-Objekt-Funktionen group(num) oder groups() verwenden, um den abgeglichenen Ausdruck zu erhalten.
| Methoden von Match-Objekten | Beschreibung |
|---|---|
| group(num=0) | Die Zeichenkette des gesamten übereinstimmenden Ausdrucks. group() kann mehrere Gruppennummern gleichzeitig entgegennehmen; in diesem Fall gibt es ein Tupel zurück, das die Werte enthält, die diesen Gruppen entsprechen. |
| groups() | Gibt ein Tupel zurück, das alle Zeichenketten der Untergruppen enthält, von 1 bis zur Anzahl der enthaltenen Untergruppen. |
Beispiel
Die Ausgabe des obigen Beispiels ist:
(0, 3) (11, 14)
Beispiel
searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter
Unterschied zwischen re.match und re.search
re.match gleicht nur den Anfang der Zeichenkette ab. Wenn der Anfang der Zeichenkette nicht dem regulären Ausdruck entspricht, schlägt der Abgleich fehl und die Funktion gibt None zurück; während re.search die gesamte Zeichenkette abgleicht, bis eine Übereinstimmung gefunden wird.
Beispiel
No match!! search --> searchObj.group() : dogs
Suchen und Ersetzen
Das re-Modul von Python bietet re.sub, um Übereinstimmungen in einer Zeichenkette zu ersetzen.
Syntax:
re.sub(pattern, repl, string, count=0, flags=0)
Parameter:
- pattern: Die Musterzeichenkette im regulären Ausdruck.
- repl: Die Ersatzzeichenkette; kann auch eine Funktion sein.
- string: Die ursprüngliche Zeichenkette, die durchsucht und ersetzt werden soll.
- count: Die maximale Anzahl der Ersetzungen nach dem Musterabgleich; Standardwert 0 bedeutet, alle Übereinstimmungen zu ersetzen.
Beispiel
电话号码是: 2004-959-559 电话号码是 : 2004959559
Der repl-Parameter ist eine Funktion
Im folgenden Beispiel werden die übereinstimmenden Zahlen in der Zeichenkette mit 2 multipliziert:
Beispiel
Die Ausgabe nach der Ausführung ist:
A46G8HFD1134
re.compile-Funktion
Die compile-Funktion wird verwendet, um einen regulären Ausdruck zu kompilieren und ein Objekt für reguläre Ausdrücke (Pattern) zu erzeugen, das von Funktionen wie match(), search() und findall() verwendet werden kann.
Das Syntaxformat ist:
re.compile(pattern[, flags])
Parameter:
-
pattern: Ein regulärer Ausdruck in Zeichenkettenform
-
flags: Optional, gibt den Übereinstimmungsmodus an, wie z. B. Ignorieren der Groß-/Kleinschreibung, Mehrzeilenmodus usw. Die konkreten Parameter sind:
- re.IGroß-/Kleinschreibung ignorieren
- re.LGibt an, dass die speziellen Zeichensätze \w, \W, \b, \B, \s, \S von der aktuellen Umgebung abhängen
- re.MMehrzeilenmodus
- re.SDas heißt.Und jedes Zeichen einschließlich Zeilenumbruch (.Ohne Zeilenumbruch)
- re.UGibt an, dass die speziellen Zeichensätze \w, \W, \b, \B, \d, \D, \s, \S von der Unicode-Zeicheneigenschaftsdatenbank abhängen
- re.XUm die Lesbarkeit zu erhöhen, Leerzeichen ignorieren und#Kommentare danach
Beispiel
Beispiel
Oben wird bei einer erfolgreichen Übereinstimmung ein Match-Objekt zurückgegeben, wobei:
group([group1, …])Die Methode wird verwendet, um die Zeichenkette zu erhalten, die von einer oder mehreren Gruppen abgeglichen wurde. Wenn Sie die gesamte übereinstimmende Teilzeichenkette erhalten möchten, können Sie direkt verwendengroup()odergroup(0);start([group])Die Methode wird verwendet, um die Startposition der von einer Gruppe abgeglichenen Teilzeichenkette in der gesamten Zeichenkette zu ermitteln (der Index des ersten Zeichens der Teilzeichenkette), mit einem Standardparameterwert von 0;end([group])Die Methode wird verwendet, um die Endposition der von einer Gruppe abgeglichenen Teilzeichenkette in der gesamten Zeichenkette zu ermitteln (der Index des letzten Zeichens der Teilzeichenkette + 1), mit einem Standardparameterwert von 0;span([group])Die Methode gibt zurück(start(group), end(group))。
Sehen wir uns ein weiteres Beispiel an:
Beispiel
findall
Findet alle Teilzeichenketten, auf die der reguläre Ausdruck in der Zeichenkette passt, und gibt eine Liste zurück. Wenn mehrere Muster übereinstimmen, wird eine Liste von Tupeln zurückgegeben. Wenn keine Übereinstimmungen gefunden werden, wird eine leere Liste zurückgegeben.
Hinweis:match und search finden nur eine Übereinstimmung, während findall alle findet.
Das Syntaxformat ist:
findall(string[, pos[, endpos]])
Parameter:
- string: Die Zeichenkette, die abgeglichen werden soll.
- pos: Optionaler Parameter, gibt die Startposition der Zeichenkette an, standardmäßig 0.
- endpos: Optionaler Parameter, gibt die Endposition der Zeichenkette an, standardmäßig die Länge der Zeichenkette.
Alle Zahlen in der Zeichenkette finden:
Beispiel
Ausgabeergebnis:
['123', '456'] ['88', '12']
Mehrere übereinstimmende Muster, gibt eine Liste von Tupeln zurück:
Beispiel
result = re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')
print(result)
[('width', '20'), ('height', '10')]
re.finditer
Ähnlich wie findall, findet alle Teilstrings, auf die der reguläre Ausdruck in der Zeichenfolge passt, und gibt sie als Iterator zurück.
re.finditer(pattern, string, flags=0)
Parameter:
| Parameter | Beschreibung |
|---|---|
| pattern | Der abzugleichende reguläre Ausdruck. |
| string | Die Zeichenfolge, die abgeglichen werden soll. |
| Flags | Flags, die verwendet werden, um das Übereinstimmungsverhalten des regulären Ausdrucks zu steuern, wie Groß-/Kleinschreibung, mehrzeilige Übereinstimmung usw. Siehe:Modifikatoren für reguläre Ausdrücke - optionale Flags |
Beispiel
Ausgabeergebnis:
12 32 43 3
re.split
Die split-Methode teilt die Zeichenfolge gemäß den Teilstrings auf, die abgeglichen werden können, und gibt eine Liste zurück. Ihre Verwendungsform ist wie folgt:
re.split(pattern, string[, maxsplit=0, flags=0])
Parameter:
| Parameter | Beschreibung |
|---|---|
| pattern | Der abzugleichende reguläre Ausdruck. |
| string | Die Zeichenfolge, die abgeglichen werden soll. |
| maxsplit | Maximale Anzahl der Aufteilungen. maxsplit=1 bedeutet, einmal aufzuteilen. Standard ist 0, was keine Begrenzung bedeutet. |
| Flags | Flags, die verwendet werden, um das Übereinstimmungsverhalten des regulären Ausdrucks zu steuern, wie Groß-/Kleinschreibung, mehrzeilige Übereinstimmung usw. Siehe:Modifikatoren für reguläre Ausdrücke - optionale Flags |
Beispiel
Objekt für reguläre Ausdrücke
re.RegexObject
re.compile() gibt ein RegexObject-Objekt zurück.
re.MatchObject
group() gibt die Zeichenkette zurück, die vom RE gefunden wurde.
- start()Gibt die Startposition der Übereinstimmung zurück
- end()Gibt die Endposition der Übereinstimmung zurück
- span()Gibt ein Tupel zurück, das die (Start-, End-)Positionen der Übereinstimmung enthält
Modifikatoren für reguläre Ausdrücke - Optionale Flags
Reguläre Ausdrücke können optionale Flag-Modifikatoren enthalten, um das Übereinstimmungsmuster zu steuern. Modifikatoren werden als optionales Flag angegeben. Mehrere Flags können durch bitweises ODER-Verknüpfen (|) angegeben werden. Zum Beispiel setzt re.I | re.M sowohl das I- als auch das M-Flag:
| Modifizierer | Beschreibung |
|---|---|
| re.I | Macht die Übereinstimmung unabhängig von Groß-/Kleinschreibung |
| re.L | Führt eine localeabhängige Übereinstimmung durch |
| re.M | Mehrzeilige Übereinstimmung, beeinflusst ^ und $ |
| re.S | Bewirkt, dass . auf alle Zeichen einschließlich Zeilenumbruch passt |
| re.U | Interpretiert Zeichen gemäß dem Unicode-Zeichensatz. Dieses Flag beeinflusst \w, \W, \b, \B. |
| re.X | Dieses Flag bietet ein flexibleres Format, sodass Sie reguläre Ausdrücke schreiben können, die leichter zu verstehen sind. |
Muster für reguläre Ausdrücke
Musterzeichenfolgen verwenden eine spezielle Syntax, um einen regulären Ausdruck darzustellen:
Buchstaben und Zahlen repräsentieren sich selbst. Buchstaben und Zahlen in einem Muster eines regulären Ausdrucks stimmen mit denselben Zeichenfolgen überein.
Die meisten Buchstaben und Zahlen haben eine andere Bedeutung, wenn ihnen ein Backslash vorangestellt ist.
Interpunktionszeichen stimmen nur dann mit sich selbst überein, wenn sie escaped sind; andernfalls haben sie eine spezielle Bedeutung.
Der Backslash selbst muss mit einem Backslash maskiert werden.
Da reguläre Ausdrücke oft Backslashes enthalten, solltest du besser Raw-Strings verwenden, um sie darzustellen. Musterelemente (wie r'\t', äquivalent zu '\\t') entsprechen den entsprechenden Sonderzeichen.
Die folgende Tabelle listet die speziellen Elemente in der Syntax regulärer Ausdrucksmuster auf. Wenn Sie optionale Flag-Parameter bei der Verwendung eines Musters angeben, kann sich die Bedeutung bestimmter Musterelemente ändern.
| Muster | Beschreibung |
|---|---|
| ^ | Entspricht dem Anfang der Zeichenkette. |
| $ | Entspricht dem Ende der Zeichenkette. |
| . | Entspricht jedem Zeichen außer Zeilenumbruch. Wenn das Flag re.DOTALL angegeben ist, kann es jedem Zeichen einschließlich Zeilenumbruch entsprechen. |
| [...] | Wird verwendet, um eine Menge von Zeichen darzustellen, die einzeln aufgelistet werden: [amk] entspricht 'a', 'm' oder 'k'. |
| [^...] | Nicht in [] enthaltene Zeichen: [^abc] entspricht jedem Zeichen außer a, b, c. |
| re* | Entspricht 0 oder mehr Vorkommen des Ausdrucks. |
| re+ | Entspricht 1 oder mehr Vorkommen des Ausdrucks. |
| re? | Entspricht 0 oder 1 Vorkommen des Fragments, das durch den vorangehenden regulären Ausdruck definiert ist, auf nicht-gierige Weise |
| re{ n} | Entspricht genau n Vorkommen des vorangehenden Ausdrucks. Zum Beispiel:o{2}Es kann nicht mit dem 'o' in "Bob" übereinstimmen, aber es kann mit den beiden o's in "food" übereinstimmen. |
| re{ n,} | Entspricht n oder mehr Vorkommen des vorangehenden Ausdrucks. Zum Beispiel kann o{2,} nicht mit dem 'o' in "Bob" übereinstimmen, aber es kann mit allen o's in "foooood" übereinstimmen. "o{1,}" ist äquivalent zu "o+". "o{0,}" ist äquivalent zu "o*". |
| re{ n, m} | Entspricht n bis m Vorkommen des Fragments, das durch den vorangehenden regulären Ausdruck definiert ist, auf gierige Weise |
| a| b | Entspricht a oder b |
| (re) | Gruppiert den regulären Ausdruck und merkt sich den übereinstimmenden Text |
| (?imx) | Der reguläre Ausdruck enthält drei optionale Flags: i, m oder x. Betrifft nur den Bereich innerhalb der Klammern. |
| (?-imx) | Der reguläre Ausdruck deaktiviert die optionalen Flags i, m oder x. Betrifft nur den Bereich innerhalb der Klammern. |
| (?: re) | Ähnlich wie (...), stellt aber keine Gruppe dar |
| (?imx: re) | Verwendet die optionalen Flags i, m oder x innerhalb der Klammern |
| (?-imx: re) | Verwendet innerhalb der Klammern nicht die optionalen Flags i, m oder x |
| (?#...) | Kommentar. |
| (?= re) | Positive Lookahead-Assertion. Wenn der enthaltene reguläre Ausdruck, dargestellt durch ..., an der aktuellen Position erfolgreich übereinstimmt, gelingt sie; andernfalls schlägt sie fehl. Aber sobald der enthaltene Ausdruck versucht wurde, rückt die Matching-Engine nicht vor; der Rest des Musters muss weiterhin rechts von der Assertion zu matchen versuchen. |
| (?! re) | Negative Lookahead-Assertion. Gegenteil der positiven Assertion; gelingt, wenn der enthaltene Ausdruck an der aktuellen Position in der Zeichenkette nicht übereinstimmen kann. |
| (?> re) | Entspricht einem unabhängigen Muster und eliminiert Backtracking. |
| \w | Entspricht Buchstaben, Ziffern und Unterstrichen. |
| \W | Entspricht allem außer Buchstaben, Ziffern und Unterstrichen. |
| \s | Entspricht jedem Whitespace-Zeichen, äquivalent zu[ \t\n\r\f]。 |
| \S | Entspricht jedem Nicht-Whitespace-Zeichen. |
| \d | Entspricht einer beliebigen Ziffer, äquivalent zu [0-9]. |
| \D | Entspricht einem beliebigen Nicht-Ziffer-Zeichen. |
| \A | Entspricht dem Anfang der Zeichenkette. |
| \Z | Entspricht dem Ende der Zeichenkette. Wenn ein Zeilenumbruch vorhanden ist, entspricht es nur dem Ende der Zeichenkette vor dem Zeilenumbruch. |
| \z | Entspricht dem Ende der Zeichenkette |
| \G | Entspricht der Position, an der die letzte Übereinstimmung abgeschlossen wurde. |
| \b | Entspricht einer Wortgrenze, das heißt, der Position zwischen einem Wort und einem Leerzeichen. Zum Beispiel kann 'er\b' mit dem 'er' in "never" übereinstimmen, aber nicht mit dem 'er' in "verb". |
| \B | Entspricht einer Nicht-Wortgrenze. 'er\B' kann mit dem 'er' in "verb" übereinstimmen, aber nicht mit dem 'er' in "never". |
| \n, \t, usw. | Entspricht einem Zeilenumbruchzeichen. Entspricht einem Tabulatorzeichen. usw. |
| \1...\9 | Entspricht dem Inhalt der n-ten Gruppe. |
| \10 | Entspricht dem Inhalt der n-ten Gruppe, wenn sie zuvor übereingestimmt hat. Andernfalls verweist es auf einen oktalen Zeichencode-Ausdruck. |
Beispiele für reguläre Ausdrücke
Zeichenübereinstimmung
| Beispiel | Beschreibung |
|---|---|
| python | Entspricht "python". |
Zeichenklassen
| Beispiel | Beschreibung |
|---|---|
| [Pp]ython | Entspricht "Python" oder "python" |
| rub[ye] | Entspricht "ruby" oder "rube" |
| [aeiou] | Entspricht einem beliebigen Buchstaben in den Klammern |
| [0-9] | Entspricht einer beliebigen Ziffer. Ähnlich wie |
| [a-z] | Entspricht einem beliebigen Kleinbuchstaben |
| [A-Z] | Entspricht einem beliebigen Großbuchstaben |
| [a-zA-Z0-9] | Entspricht einem beliebigen Buchstaben oder einer Ziffer |
| [^aeiou] | Alle Zeichen außer den Buchstaben aeiou |
| [^0-9] | Entspricht Zeichen, die keine Ziffern sind |
Spezielle Zeichenklassen
| Beispiel | Beschreibung |
|---|---|
| . | Stimmt mit jedem einzelnen Zeichen außer "\n" überein. Um mit jedem Zeichen einschließlich '\n' übereinzustimmen, verwenden Sie ein Muster wie '[.\n]'. |
| \d | Entspricht einem Ziffernzeichen. Äquivalent zu [0-9]. |
| \D | Entspricht einem Nicht-Ziffernzeichen. Äquivalent zu [^0-9]. |
| \s | Entspricht jedem Leerraumzeichen, einschließlich Leerzeichen, Tabulator, Seitenvorschub usw. Äquivalent zu [ \f\n\r\t\v]. |
| \S | Entspricht jedem Nicht-Leerraumzeichen. Äquivalent zu [^ \f\n\r\t\v]. |
| \w | Entspricht einem beliebigen Wortzeichen einschließlich Unterstrich. Äquivalent zu '[A-Za-z0-9_]'. |
| \W | Entspricht einem beliebigen Nicht-Wortzeichen. Äquivalent zu '[^A-Za-z0-9_]'. |