Python 3 - Reguläre Ausdrücke
Ein regulärer Ausdruck ist eine spezielle Folge von Zeichen, mit deren Hilfe Sie andere Zeichenfolgen oder Sätze von Zeichenfolgen mithilfe einer speziellen Syntax in einem Muster abgleichen oder finden können. Reguläre Ausdrücke sind in der UNIX-Welt weit verbreitet.
Das Modul rebietet vollständige Unterstützung für Perl-ähnliche reguläre Ausdrücke in Python. Dasre Modul löst die Ausnahme aus re.error wenn beim Kompilieren oder Verwenden eines regulären Ausdrucks ein Fehler auftritt.
Wir würden zwei wichtige Funktionen behandeln, die zur Behandlung regulärer Ausdrücke verwendet werden. Dennoch eine kleine Sache zuerst: Es gibt verschiedene Zeichen, die eine besondere Bedeutung haben würden, wenn sie im regulären Ausdruck verwendet werden. Um Verwirrung beim Umgang mit regulären Ausdrücken zu vermeiden, verwenden wir Raw Strings asr'expression'.
Grundmuster, die mit einzelnen Zeichen übereinstimmen
Sr.Nr. | Ausdruck & Übereinstimmungen |
---|---|
1 | a, X, 9, < gewöhnliche Charaktere passen einfach genau zu sich. |
2 | . (a period) stimmt mit einem einzelnen Zeichen außer der Zeilenumbruch '\ n' überein. |
3 | \w entspricht einem "Wort" -Zeichen: einem Buchstaben oder einer Ziffer oder einem Unterstrich [a-zA-Z0-9_]. |
4 | \W Entspricht einem beliebigen Nicht-Wort-Zeichen. |
5 | \b Grenze zwischen Wort und Nichtwort |
6 | \s Entspricht einem einzelnen Leerzeichen - Leerzeichen, Zeilenumbruch, Rückgabe, Tabulator |
7 | \S Entspricht einem Nicht-Leerzeichen. |
8 | \t, \n, \r Tab, Newline, Return |
9 | \d Dezimalstelle [0-9] |
10 | ^ stimmt mit dem Anfang der Zeichenfolge überein |
11 | $ Passen Sie das Ende der Zeichenfolge an |
12 | \ hemmen die "Besonderheit" eines Charakters. |
Kompilierungsflags
Mit Kompilierungsflags können Sie einige Aspekte der Funktionsweise regulärer Ausdrücke ändern. Flags sind im re-Modul unter zwei Namen verfügbar, einem langen Namen wie zIGNORECASE und eine kurze Ein-Buchstaben-Form wie I.
Sr.Nr. | Flagge & Bedeutung |
---|---|
1 | ASCII, A Lässt mehrere Escapezeichen wie \ w, \ b, \ s und \ d nur für ASCII-Zeichen mit der jeweiligen Eigenschaft übereinstimmen. |
2 | DOTALL, S Machen Sie, passen Sie jedes Zeichen an, einschließlich Zeilenumbrüche |
3 | IGNORECASE, I Führen Sie Übereinstimmungen ohne Berücksichtigung der Groß- und Kleinschreibung durch |
4 | LOCALE, L Führen Sie ein Gebietsschema-fähiges Match durch |
5 | MULTILINE, M Mehrzeiliger Abgleich, der sich auf ^ und $ auswirkt |
6 | VERBOSE, X (for ‘extended’) Aktivieren Sie ausführliche REs, die übersichtlicher und verständlicher organisiert werden können |
Die Match-Funktion
Diese Funktion versucht, das RE- Muster mit den Zeichenfolgen mit optionalen Flags abzugleichen .
Hier ist die Syntax für diese Funktion -
re.match(pattern, string, flags = 0)
Hier ist die Beschreibung der Parameter -
Sr.Nr. | Parameter & Beschreibung |
---|---|
1 | pattern Dies ist der reguläre Ausdruck, der abgeglichen werden soll. |
2 | string Dies ist die Zeichenfolge, nach der gesucht wird, um mit dem Muster am Anfang der Zeichenfolge übereinzustimmen. |
3 | flags Sie können verschiedene Flags mit bitweisem ODER (|) angeben. Dies sind Modifikatoren, die in der folgenden Tabelle aufgeführt sind. |
Die Funktion re.match gibt a zurückmatch Objekt auf Erfolg, Nonebei Ausfall. Wir verwenden die Funktion group (num) oder groups () vonmatch Objekt, um einen übereinstimmenden Ausdruck zu erhalten.
Sr.Nr. | Match Object Method & Description |
---|---|
1 | group(num = 0) Diese Methode gibt die gesamte Übereinstimmung (oder eine bestimmte Untergruppennummer) zurück. |
2 | groups() Diese Methode gibt alle übereinstimmenden Untergruppen in einem Tupel zurück (leer, wenn keine vorhanden waren). |
Beispiel
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print ("matchObj.group() : ", matchObj.group())
print ("matchObj.group(1) : ", matchObj.group(1))
print ("matchObj.group(2) : ", matchObj.group(2))
else:
print ("No match!!")
Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
Die Suchfunktion
Diese Funktion sucht nach dem ersten Auftreten eines RE- Musters innerhalb einer Zeichenfolge mit optionalen Flags .
Hier ist die Syntax für diese Funktion -
re.search(pattern, string, flags = 0)
Hier ist die Beschreibung der Parameter -
Sr.Nr. | Parameter & Beschreibung |
---|---|
1 | pattern Dies ist der reguläre Ausdruck, der abgeglichen werden soll. |
2 | string Dies ist die Zeichenfolge, die gesucht wird, um mit dem Muster an einer beliebigen Stelle in der Zeichenfolge übereinzustimmen. |
3 | flags Sie können verschiedene Flags mit bitweisem ODER (|) angeben. Dies sind Modifikatoren, die in der folgenden Tabelle aufgeführt sind. |
Die Forschungsfunktion gibt a zurückmatch Objekt auf Erfolg, nonebei Ausfall. Wir verwenden die Funktion group (num) oder groups () vonmatch Objekt, um den übereinstimmenden Ausdruck zu erhalten.
Sr.Nr. | Match Object Method & Description |
---|---|
1 | group(num = 0) Diese Methode gibt die gesamte Übereinstimmung (oder eine bestimmte Untergruppennummer) zurück. |
2 | groups() Diese Methode gibt alle übereinstimmenden Untergruppen in einem Tupel zurück (leer, wenn keine vorhanden waren). |
Beispiel
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print ("searchObj.group() : ", searchObj.group())
print ("searchObj.group(1) : ", searchObj.group(1))
print ("searchObj.group(2) : ", searchObj.group(2))
else:
print ("Nothing found!!")
Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
Matching versus Suche
Python bietet zwei verschiedene primitive Operationen an, die auf regulären Ausdrücken basieren: match sucht nur am Anfang der Zeichenfolge nach einer Übereinstimmung, während search prüft, ob irgendwo in der Zeichenfolge eine Übereinstimmung vorliegt (dies ist standardmäßig bei Perl der Fall).
Beispiel
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
print ("search --> searchObj.group() : ", searchObj.group())
else:
print ("Nothing found!!")
Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt:
No match!!
search --> matchObj.group() : dogs
Suchen und ersetzen
Eins der wichtigsten re Methoden, die reguläre Ausdrücke verwenden, ist sub.
Syntax
re.sub(pattern, repl, string, max=0)
Diese Methode ersetzt alle Vorkommen des RE- Musters in der Zeichenfolge durch repl und ersetzt alle Vorkommen, sofern nicht max angegeben ist. Diese Methode gibt eine geänderte Zeichenfolge zurück.
Beispiel
#!/usr/bin/python3
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)
# Remove anything other than digits
num = re.sub(r'\D', "", phone)
print ("Phone Num : ", num)
Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt:
Phone Num : 2004-959-559
Phone Num : 2004959559
Modifikatoren für reguläre Ausdrücke: Optionsflags
Literale für reguläre Ausdrücke können einen optionalen Modifikator enthalten, um verschiedene Aspekte des Abgleichs zu steuern. Die Modifikatoren werden als optionales Flag angegeben. Sie können mehrere Modifikatoren mit dem exklusiven ODER (|) bereitstellen, wie zuvor gezeigt, und können durch eines dieser Elemente dargestellt werden:
Sr.Nr. | Modifikator & Beschreibung |
---|---|
1 | re.I Führt einen Matching ohne Berücksichtigung der Groß- und Kleinschreibung durch. |
2 | re.L Interpretiert Wörter gemäß dem aktuellen Gebietsschema. Diese Interpretation betrifft die alphabetische Gruppe (\ w und \ W) sowie das Wortgrenzenverhalten (\ b und \ B). |
3 | re.M Lässt $ mit dem Ende einer Zeile übereinstimmen (nicht nur mit dem Ende der Zeichenfolge) und ^ mit dem Anfang einer beliebigen Zeile (nicht nur mit dem Anfang der Zeichenfolge) übereinstimmen. |
4 | re.S Lässt einen Punkt (Punkt) mit einem beliebigen Zeichen übereinstimmen, einschließlich einer neuen Zeile. |
5 | re.U Interpretiert Buchstaben gemäß dem Unicode-Zeichensatz. Dieses Flag beeinflusst das Verhalten von \ w, \ W, \ b, \ B. |
6 | re.X Ermöglicht die "niedlichere" Syntax regulärer Ausdrücke. Es ignoriert Leerzeichen (außer innerhalb eines Sets [] oder wenn es durch einen Backslash maskiert wird) und behandelt nicht entkoppeltes # als Kommentarmarker. |
Muster für reguläre Ausdrücke
Mit Ausnahme der Steuerzeichen (+ ? . * ^ $ ( ) [ ] { } | \)Alle Charaktere stimmen überein. Sie können einem Steuerzeichen entkommen, indem Sie ihm einen Backslash voranstellen.
In der folgenden Tabelle ist die in Python verfügbare Syntax für reguläre Ausdrücke aufgeführt.
Sr.Nr. | Parameter & Beschreibung |
---|---|
1 | ^ Entspricht dem Zeilenanfang. |
2 | $ Entspricht dem Zeilenende. |
3 | . Entspricht einem einzelnen Zeichen außer Zeilenumbruch. Mit der Option m kann auch der Zeilenumbruch abgeglichen werden. |
4 | [...] Entspricht einem einzelnen Zeichen in Klammern. |
5 | [^...] Entspricht einem einzelnen Zeichen, das nicht in Klammern steht |
6 | re* Entspricht 0 oder mehr Vorkommen des vorhergehenden Ausdrucks. |
7 | re+ Entspricht 1 oder mehr Vorkommen des vorhergehenden Ausdrucks. |
8 | re? Entspricht 0 oder 1 Vorkommen des vorhergehenden Ausdrucks. |
9 | re{ n} Entspricht genau n Vorkommen des vorhergehenden Ausdrucks. |
10 | re{ n,} Entspricht n oder mehr Vorkommen des vorhergehenden Ausdrucks. |
11 | re{ n, m} Entspricht mindestens n und höchstens m Vorkommen des vorhergehenden Ausdrucks. |
12 | a|b Entspricht entweder a oder b. |
13 | (re) Gruppiert reguläre Ausdrücke und merkt sich übereinstimmenden Text. |
14 | (?imx) Schaltet vorübergehend die Optionen i, m oder x innerhalb eines regulären Ausdrucks um. In Klammern ist nur dieser Bereich betroffen. |
15 | (?-imx) Schaltet die i-, m- oder x-Optionen innerhalb eines regulären Ausdrucks vorübergehend aus. In Klammern ist nur dieser Bereich betroffen. |
16 | (?: re) Gruppiert reguläre Ausdrücke, ohne sich an übereinstimmenden Text zu erinnern. |
17 | (?imx: re) Schaltet vorübergehend die Optionen i, m oder x in Klammern um. |
18 | (?-imx: re) Schaltet die Optionen i, m oder x vorübergehend in Klammern aus. |
19 | (?#...) Kommentar. |
20 | (?= re) Gibt die Position anhand eines Musters an. Hat keine Reichweite. |
21 | (?! re) Gibt die Position mithilfe der Musterverneinung an. Hat keine Reichweite. |
22 | (?> re) Entspricht einem unabhängigen Muster ohne Rückverfolgung. |
23 | \w Entspricht Wortzeichen. |
24 | \W Entspricht Nichtwortzeichen. |
25 | \s Entspricht Leerzeichen. Entspricht [\ t \ n \ r \ f]. |
26 | \S Entspricht Nicht-Leerzeichen. |
27 | \d Entspricht den Ziffern. Entspricht [0-9]. |
28 | \D Entspricht nicht-stelligen. |
29 | \A Entspricht dem Zeichenfolgenanfang. |
30 | \Z Entspricht dem Ende der Zeichenfolge. Wenn eine neue Zeile vorhanden ist, stimmt sie kurz vor der neuen Zeile überein. |
31 | \z Entspricht dem Ende der Zeichenfolge. |
32 | \G Spielpunkt, an dem das letzte Spiel beendet wurde. |
33 | \b Entspricht den Wortgrenzen außerhalb der Klammern. Entspricht der Rücktaste (0x08) in Klammern. |
34 | \B Entspricht Nicht-Wortgrenzen. |
35 | \n, \t, etc. Entspricht Zeilenumbrüchen, Wagenrückläufen, Tabulatoren usw. |
36 | \1...\9 Entspricht dem n-ten gruppierten Unterausdruck. |
37 | \10 Entspricht dem n-ten gruppierten Unterausdruck, wenn er bereits übereinstimmt. Ansonsten bezieht sich auf die oktale Darstellung eines Zeichencodes. |
Beispiele für reguläre Ausdrücke
Wörtliche Zeichen
Sr.Nr. | Beispiel & Beschreibung |
---|---|
1 | python Match "Python". |
Zeichenklassen
Sr.Nr. | Beispiel & Beschreibung |
---|---|
1 | [Pp]ython Entspricht "Python" oder "Python" |
2 | rub[ye] Match "Rubin" oder "Rube" |
3 | [aeiou] Passen Sie einen beliebigen Kleinbuchstaben an |
4 | [0-9] Entspricht einer beliebigen Ziffer. das gleiche wie [0123456789] |
5 | [a-z] Passen Sie einen beliebigen ASCII-Kleinbuchstaben an |
6 | [A-Z] Passen Sie einen beliebigen ASCII-Großbuchstaben an |
7 | [a-zA-Z0-9] Passen Sie zu einem der oben genannten Punkte |
8 | [^aeiou] Passen Sie etwas anderes als einen Kleinbuchstaben an |
9 | [^0-9] Ordnen Sie etwas anderes als eine Ziffer zu |
Sonderzeichenklassen
Sr.Nr. | Beispiel & Beschreibung |
---|---|
1 | . Entspricht einem beliebigen Zeichen außer Newline |
2 | \d Entspricht einer Ziffer: [0-9] |
3 | \D Entspricht einer nichtstelligen Zahl: [^ 0-9] |
4 | \s Entspricht einem Leerzeichen: [\ t \ r \ n \ f] |
5 | \S Nicht-Leerzeichen abgleichen: [^ \ t \ r \ n \ f] |
6 | \w Entspricht einem einzelnen Wortzeichen: [A-Za-z0-9_] |
7 | \W Entspricht einem Nichtwortzeichen: [^ A-Za-z0-9_] |
Wiederholungsfälle
Sr.Nr. | Beispiel & Beschreibung |
---|---|
1 | ruby? Match "rub" oder "ruby": das y ist optional |
2 | ruby* Match "rub" plus 0 oder mehr ys |
3 | ruby+ Match "rub" plus 1 oder mehr ys |
4 | \d{3} Passen Sie genau 3 Ziffern an |
5 | \d{3,} Entspricht 3 oder mehr Ziffern |
6 | \d{3,5} Passen Sie 3, 4 oder 5 Ziffern an |
Nongreedy Wiederholung
Dies entspricht der geringsten Anzahl von Wiederholungen -
Sr.Nr. | Beispiel & Beschreibung |
---|---|
1 | <.*> Gierige Wiederholung: Entspricht "<python> perl>" |
2 | <.*?> Nongreedy: Entspricht "<python>" in "<python> perl>" |
Gruppieren mit Klammern
Sr.Nr. | Beispiel & Beschreibung |
---|---|
1 | \D\d+ Keine Gruppe: + wiederholt \ d |
2 | (\D\d)+ Gruppiert: + wiederholt \ D \ d Paar |
3 | ([Pp]ython(,)?)+ Match "Python", "Python, Python, Python" usw. |
Rückreferenzen
Dies entspricht wieder einer zuvor übereinstimmenden Gruppe -
Sr.Nr. | Beispiel & Beschreibung |
---|---|
1 | ([Pp])ython&\1ails Passen Sie Python & Eimer oder Python & Eimer an |
2 | (['"])[^\1]*\1 Einfache oder doppelte Zeichenfolge. \ 1 stimmt mit der 1. Gruppe überein. \ 2 stimmt mit der 2. Gruppe überein usw. |
Alternativen
Sr.Nr. | Beispiel & Beschreibung |
---|---|
1 | python|perl Match "Python" oder "Perl" |
2 | rub(y|le) Match "Rubin" oder "Rubel" |
3 | Python(!+|\?) "Python" gefolgt von einem oder mehreren! oder einer? |
Anker
Dies muss die Übereinstimmungsposition angeben.
Sr.Nr. | Beispiel & Beschreibung |
---|---|
1 | ^Python Passen Sie "Python" am Anfang eines Strings oder einer internen Zeile an |
2 | Python$ Entspricht "Python" am Ende einer Zeichenfolge oder Zeile |
3 | \APython Entspricht "Python" am Anfang einer Zeichenfolge |
4 | Python\Z Entspricht "Python" am Ende eines Strings |
5 | \bPython\b Passen Sie "Python" an einer Wortgrenze an |
6 | \brub\B \ B ist eine Nichtwortgrenze: Entspricht "rub" in "rube" und "ruby", aber nicht allein |
7 | Python(?=!) Entspricht "Python", wenn ein Ausrufezeichen folgt. |
8 | Python(?!!) Entspricht "Python", wenn kein Ausrufezeichen folgt. |
Spezielle Syntax mit Klammern
Sr.Nr. | Beispiel & Beschreibung |
---|---|
1 | R(?#comment) Entspricht "R". Der Rest ist ein Kommentar |
2 | R(?i)uby Groß- und Kleinschreibung wird nicht berücksichtigt, während "uby" |
3 | R(?i:uby) Das gleiche wie oben |
4 | rub(?:y|le)) Nur gruppieren, ohne \ 1 Rückreferenz zu erstellen |