Python3 Reguläre Ausdrücke
Ein regulärer Ausdruck ist eine spezielle Zeichenfolge, die Ihnen bequem dabei hilft zu prüfen, ob eine Zeichenkette einem bestimmten Muster entspricht.
In Python verwenden Sie dasre-Modul, um reguläre Ausdrücke zu verarbeiten.
Das re-Modul bietet eine Reihe von Funktionen, mit denen Sie Musterabgleich, Suche und Ersetzungsvorgänge in Zeichenketten durchführen können.
reDas Modul verleiht der Sprache Python vollständige Funktionalität für reguläre Ausdrücke.
Dieses Kapitel stellt hauptsächlich die häufig verwendeten Funktionen zur Verarbeitung regulärer Ausdrücke in Python vor. Wenn Sie mit regulären Ausdrücken nicht vertraut sind, können Sie unserTutorial zu regulären Ausdrücken ansehen。
re.match-Funktion
re.match versucht, ein Muster ab der Startposition der Zeichenkette 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 Übereinstimmungsmethode des regulären Ausdrucks zu steuern, wie z. B. Groß-/Kleinschreibung, mehrzeiliger Abgleich usw. Siehe:Modifikatoren für reguläre Ausdrücke - Optionale Flags |
Bei erfolgreicher Übereinstimmung gibt die Methodere.matchein Match-Objekt zurück, andernfalls gibt sieNone zurück。
Wir könnengroup(num)odergroups()Match-Objekt-Funktionen verwenden, um den übereinstimmenden Ausdruck zu erhalten.
| Methoden von Match-Objekten | Beschreibung |
|---|---|
| group(num=0) | Der String des gesamten übereinstimmenden Ausdrucks. group() kann mehrere Gruppennummern gleichzeitig annehmen; 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 Ausführungsergebnis 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, mehrzeiliger Abgleich usw. Siehe:Modifikatoren für reguläre Ausdrücke - Optionale Flags |
Bei erfolgreicher Übereinstimmung gibt die Methode re.search 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) | Der String des gesamten übereinstimmenden Ausdrucks. group() kann mehrere Gruppennummern gleichzeitig annehmen; 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.matchEs gleicht nur den Anfang der Zeichenkette ab. Wenn der Anfang der Zeichenkette nicht mit dem regulären Ausdruck übereinstimmt, schlägt der Abgleich fehl und die Funktion gibt None zurück, währendre.searchEs durchsucht die gesamte Zeichenkette, bis eine Übereinstimmung gefunden wird.
Beispiel
No match!! search --> matchObj.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, die auch eine Funktion sein kann.
- string: Die ursprüngliche Zeichenkette, die durchsucht und ersetzt werden soll.
- count: Die maximale Anzahl der Ersetzungen nach dem Musterabgleich. Der Standardwert 0 bedeutet, alle Übereinstimmungen zu ersetzen.
- flags: Der Übereinstimmungsmodus, der zur Kompilierzeit verwendet wird, in numerischer Form.
Die ersten drei sind erforderliche Parameter, und die letzten beiden sind optionale Parameter.
Beispiel
Das Ausführungsergebnis des obigen Beispiels ist wie folgt:
电话号码 : 2004-959-559 电话号码 : 2004959559
Der repl-Parameter ist eine Funktion
Im folgenden Beispiel werden die übereinstimmenden Zahlen in der Zeichenkette mit 2 multipliziert:
Beispiel
Das Ausführungsergebnis ist:
A46G8HFD1134
compile-Funktion
Die compile-Funktion wird verwendet, um einen regulären Ausdruck zu kompilieren und ein reguläres Ausdrucksobjekt (Pattern) zu erzeugen, das von den Funktionen match() und search() verwendet wird.
Das Syntaxformat ist:
re.compile(pattern[, flags])
Parameter:
- pattern: Ein regulärer Ausdruck in Zeichenkettenform
- flags ist optional und gibt den Übereinstimmungsmodus an, z. B. Ignorieren der Groß-/Kleinschreibung, Mehrzeilenmodus usw. Die spezifischen Parameter sind:
-
re.IGNORECASE oder re.I- Bewirkt, dass bei der Übereinstimmung die Groß-/Kleinschreibung ignoriert wird
- re.L gibt an, dass die speziellen Zeichensätze \w, \W, \b, \B, \s, \S von der aktuellen Umgebung abhängen
- re.MULTILINE oder re.M - Mehrzeilenmodus, ändert das Verhalten von ^ und $, sodass sie mit dem Anfang und dem Ende jeder Zeile der Zeichenkette übereinstimmen.
- re.DOTALL oder re.S – Bewirkt, dass.jedes Zeichen einschließlich Zeilenumbruch übereinstimmt.
- re.ASCII – Bewirkt, dass \w, \W, \b, \B, \d, \D, \s, \S nur auf ASCII-Zeichen passen.
- re.VERBOSE oder re.X – Ignoriert Leerzeichen und Kommentare, wodurch komplexe reguläre Ausdrücke klarer organisiert werden können.
Diese Flags können einzeln oder kombiniert mit bitweisem OR (|) verwendet werden. Zum Beispiel bedeutet re.IGNORECASE | re.MULTILINE, dass sowohl die Groß-/Kleinschreibung ignoriert als auch der Mehrzeilenmodus aktiviert wird.
Beispiel
Beispiel
Oben wird bei erfolgreicher Übereinstimmung ein Match-Objekt zurückgegeben, wobei:
group([group1, …])Die Methode wird verwendet, um eine oder mehrere gruppenweise übereinstimmende Zeichenketten zu erhalten. Wenn Sie den gesamten übereinstimmenden Teilstring erhalten möchten, können Sie direkt verwendengroup()odergroup(0);start([group])Die Methode wird verwendet, um die Startposition des gruppenübereinstimmenden Teilstrings im gesamten String zu erhalten (der Index des ersten Zeichens des Teilstrings). Der Standardwert des Parameters ist 0;end([group])Die Methode wird verwendet, um die Endposition des gruppenübereinstimmenden Teilstrings im gesamten String zu erhalten (der Index des letzten Zeichens des Teilstrings + 1). Der Standardwert des Parameters ist 0;span([group])Die Methode gibt zurück(start(group), end(group))。
Sehen wir uns ein weiteres Beispiel an:
Beispiel
findall
Findet alle Teilstrings, die vom Regex im String übereinstimmen, und gibt eine Liste zurück. Wenn es mehrere übereinstimmende Muster gibt, wird eine Liste von Tupeln zurückgegeben. Wenn keine Übereinstimmungen gefunden werden, wird eine leere Liste zurückgegeben.
Hinweis:match und search stimmen einmal überein, findall stimmt mit allen überein.
Die Syntax lautet:
re.findall(pattern, string, flags=0) oder pattern.findall(string[, pos[, endpos]])
Parameter:
- patternDas übereinstimmende Muster.
- stringDie Zeichenkette, die abgeglichen werden soll.
- posOptionaler Parameter, gibt die Startposition in der Zeichenkette an, standardmäßig 0.
- endposOptionaler Parameter, gibt die Endposition in der Zeichenkette an, standardmäßig die Länge der Zeichenkette.
Alle Zahlen in einer Zeichenkette finden:
Beispiel
Ausgabeergebnis:
['123', '456'] ['123', '456'] ['88', '12']
Mehrere übereinstimmende Muster, Rückgabe einer Liste von Tupeln:
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 Teilzeichenketten, die vom regulären Ausdruck in der Zeichenkette abgeglichen werden, und gibt sie als Iterator zurück.
re.finditer(pattern, string, flags=0)
Parameter:
| Parameter | Beschreibung |
|---|---|
| pattern | Der reguläre Ausdruck zum Abgleichen |
| string | Die Zeichenfolge, die abgeglichen werden soll. |
| Flags | Flags, die verwendet werden, um das Übereinstimmungsverhalten des regulären Ausdrucks zu steuern, z. B. Groß-/Kleinschreibung, Mehrzeilenabgleich usw. Siehe:Modifikatoren für reguläre Ausdrücke – optionale Flags |
Beispiel
Ausgabeergebnis:
12 32 43 3
re.split
Die Methode split teilt die Zeichenfolge durch die übereinstimmenden Teilzeichenfolgen und gibt eine Liste zurück. Ihre Verwendung ist wie folgt:
re.split(pattern, string[, maxsplit=0, flags=0])
Parameter:
| Parameter | Beschreibung |
|---|---|
| pattern | Der reguläre Ausdruck zum Abgleichen |
| string | Die Zeichenfolge, die abgeglichen werden soll. |
| maxsplit | Anzahl der Teilungen, maxsplit=1 teilt einmal, Standard ist 0, keine Begrenzung der Anzahl. |
| Flags | Flags, die verwendet werden, um das Übereinstimmungsverhalten des regulären Ausdrucks zu steuern, z. B. Groß-/Kleinschreibung, Mehrzeilenabgleich 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 einige optionale Flag-Modifikatoren enthalten, um Übereinstimmungsmodi zu steuern.
Die folgenden Flags können allein oder kombiniert mit bitweisem OR (|) verwendet werden. Zum Beispiel bedeutet re.IGNORECASE | re.MULTILINE, dass sowohl der Modus ohne Beachtung der Groß-/Kleinschreibung als auch der Mehrzeilenmodus aktiviert wird.
| Modifizierer | Beschreibung | Beispiel |
|---|---|---|
| re.IGNORECASE oder re.I | Bewirkt, dass beim Abgleich die Groß-/Kleinschreibung ignoriert wird. |
import re
pattern = re.compile(r'apple', flags=re.IGNORECASE)
result = pattern.match('Apple')
print(result.group()) # 输出: 'Apple'
|
| re.MULTILINE oder re.M | Mehrzeilenabgleich, beeinflusst^und$, sodass sie den Anfang und das Ende jeder Zeile in der Zeichenfolge abgleichen. |
import re pattern = re.compile(r'^\d+', flags=re.MULTILINE) text = '123\n456\n789' result = pattern.findall(text) print(result) # 输出: ['123', '456', '789'] |
| re.DOTALL oder re.S: | sorgt dafür, dass.mit jedem Zeichen einschließlich Zeilenumbruch übereinstimmt. |
import re
pattern = re.compile(r'a.b', flags=re.DOTALL)
result = pattern.match('a\nb')
print(result.group()) # 输出: 'a\nb'
|
| re.ASCII | Bewirkt, dass \w, \W, \b, \B, \d, \D, \s, \S nur mit ASCII-Zeichen übereinstimmen. |
import re
pattern = re.compile(r'\w+', flags=re.ASCII)
result = pattern.match('Hello123')
print(result.group()) # 输出: 'Hello123'
|
| re.VERBOSE oder re.X | Ignoriert Leerzeichen und Kommentare, sodass komplexe Regexes klarer organisiert werden können. |
import re
pattern = re.compile(r'''
\d+ # 匹配数字
[a-z]+ # 匹配小写字母
''', flags=re.VERBOSE)
result = pattern.match('123abc')
print(result.group()) # 输出: '123abc'
|
Muster für reguläre Ausdrücke
Muster-Strings verwenden eine spezielle Syntax, um einen regulären Ausdruck darzustellen.
Buchstaben und Zahlen repräsentieren sich selbst. Buchstaben und Zahlen in einem Regex-Muster stimmen mit denselben Zeichenfolgen überein.
Die meisten Buchstaben und Zahlen haben eine andere Bedeutung, wenn ihnen ein Backslash vorangestellt ist.
Satzzeichen stimmen nur dann mit sich selbst überein, wenn sie escaped sind; andernfalls repräsentieren sie besondere Bedeutungen.
Der Backslash selbst muss mit einem Backslash maskiert werden.
Da reguläre Ausdrücke oft Backslashes enthalten, ist es am besten, Raw-Strings zu ihrer Darstellung zu verwenden. Muster-Elemente (wier'\t', äquivalent zu\\t) stimmen mit den entsprechenden Sonderzeichen überein.
Die folgende Tabelle listet die speziellen Elemente in der Syntax von Regex-Mustern auf. Wenn Sie optionale Flag-Parameter bei der Verwendung von Mustern angeben, ändern sich die Bedeutungen einiger Muster-Elemente.
| 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 auf eines der enthaltenen Zeichen zuzutreffen, z. B. [amk] stimmt mit 'a', 'm' oder 'k' überein. |
| [^...] | Zeichen, die nicht in [] enthalten sind: [^abc] stimmt mit anderen Zeichen als a, b, c überein. |
| re* | Entspricht 0 oder mehr Wiederholungen des Ausdrucks. |
| re+ | Entspricht 1 oder mehr Wiederholungen des Ausdrucks. |
| re? | Entspricht 0 oder 1 Vorkommen des vom vorangehenden Regex definierten Fragments, nicht gierig. |
| re{ n} | Entspricht n Vorkommen des vorangehenden Ausdrucks. Zum Beispiel kann "o{2}" nicht mit dem "o" in "Bob" übereinstimmen, aber mit den beiden o's in "food". |
| re{ n,} | Entspricht n oder mehr des vorangehenden Ausdrucks. Zum Beispiel kann "o{2,}" nicht mit dem "o" in "Bob" übereinstimmen, aber mit allen o's in "foooood". "o{1,}" ist äquivalent zu "o+". "o{0,}" ist äquivalent zu "o*". |
| re{ n, m} | Entspricht n bis m Wiederholungen des vom vorangehenden Regex definierten Fragments, gierig. |
| a| b | Entspricht a oder b |
| (re) | Entspricht dem Ausdruck innerhalb der Klammern und stellt auch eine Gruppe dar. |
| (?imx) | Regex enthält drei optionale Flags: i, m oder x. Wirkt sich nur auf den Bereich innerhalb der Klammern aus. |
| (?-imx) | Regex deaktiviert die optionalen Flags i, m oder x. Wirkt sich nur auf den Bereich innerhalb der Klammern aus. |
| (?: re) | Ähnlich wie (...), aber stellt keine Gruppe dar. |
| (?imx: re) | Verwendet die optionalen Flags i, m oder x innerhalb der Klammern. |
| (?-imx: re) | Verwendet nicht die optionalen Flags i, m oder x innerhalb der Klammern. |
| (?#...) | Kommentar. |
| (?= re) | Positive Lookahead-Assertion. Wenn der enthaltene reguläre Ausdruck, gekennzeichnet durch ..., an der aktuellen Position erfolgreich übereinstimmt, gelingt sie; andernfalls schlägt sie fehl. Sobald jedoch der enthaltene Ausdruck versucht wurde, rückt die Matching-Engine überhaupt nicht vor; der Rest des Musters versucht weiterhin die rechte Seite der Assertion. |
| (?! re) | Negative Lookahead-Assertion. Das Gegenteil der positiven Assertion; gelingt, wenn der enthaltene Ausdruck an der aktuellen Position im String nicht übereinstimmen kann. |
| (?> re) | Unabhängiges Matching-Muster, ohne Backtracking. |
| \w | Stimmt mit Ziffern, Buchstaben und Unterstrich überein. |
| \W | Stimmt mit Zeichen überein, die keine Ziffern, Buchstaben oder Unterstriche sind. |
| \s | Stimmt mit jedem Whitespace-Zeichen überein, äquivalent zu [\t\n\r\f]. |
| \S | Stimmt mit jedem Nicht-Whitespace-Zeichen überein. |
| \d | Entspricht einer beliebigen Ziffer, äquivalent zu [0-9]. |
| \D | Stimmt mit jeder Nicht-Ziffer überein. |
| \A | Entspricht dem Anfang der Zeichenkette. |
| \Z | Stimmt mit dem Ende der Zeichenkette überein. Wenn ein Zeilenumbruch vorhanden ist, stimmt es nur mit dem Ende der Zeichenkette vor dem Zeilenumbruch überein. |
| \z | Entspricht dem Ende der Zeichenkette. |
| \G | Entspricht der Position, an der die letzte Übereinstimmung abgeschlossen wurde. |
| \b | Stimmt mit einer Wortgrenze überein, also 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. | Stimmt mit einem Zeilenumbruch überein. Stimmt mit einem Tabulator überein, usw. |
| \1...\9 | Entspricht dem Inhalt der n-ten Gruppe. |
| \10 | Entspricht dem Inhalt der n-ten Gruppe, wenn diese ü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 einzelnen Buchstaben innerhalb der 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_]'. |