Python Reguläre Ausdrücke: Praktischer Leitfaden
Einführung
Das Python-Modul re bietet vollständige Unterstützung für Perl-ähnliche reguläre Ausdrücke. Das Modul löst re.error aus, wenn ein Fehler beim Kompilieren oder Verwenden eines regulären Ausdrucks auftritt.
Wir behandeln zwei wichtige Funktionen. Vorab: Verschiedene Zeichen haben in regulären Ausdrücken spezielle Bedeutung. Um Verwirrung zu vermeiden, verwenden wir Raw Strings als r'expression'.
Die match-Funktion
Versucht, das RE-pattern am Anfang des string mit optionalen flags zu matchen.
re.match(pattern, string, flags=0)
Parameter
| Nr. | Parameter & Beschreibung |
|---|---|
| 1 | pattern – Der reguläre Ausdruck zum Matchen. |
| 2 | string – Der String, der am Anfang nach dem Muster durchsucht wird. |
| 3 | flags – Modifikatoren per bitweisem OR (|). Siehe Tabelle unten. |
re.match gibt bei Erfolg ein Match-Objekt zurück, bei Fehlschlag None. Mit group(num) oder groups() des Match-Objekts erhalten Sie den gematchten Ausdruck.
| Nr. | Match-Objekt-Methode & Beschreibung |
|---|---|
| 1 | group(num=0) – Gibt gesamten Match (oder spezifische Untergruppe num) zurück. |
| 2 | groups() – Gibt alle passenden Untergruppen als Tupel zurück (leer, falls keine). |
Beispiel
#!/usr/bin/python
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!!")
Ausgabe:
matchObj.group() : Cats are smarter than dogs matchObj.group(1) : Cats matchObj.group(2) : smarter
Die search-Funktion
Sucht nach dem ersten Vorkommen des RE-pattern irgendwo im string mit optionalen flags.
re.search(pattern, string, flags=0)
Parameter
| Nr. | Parameter & Beschreibung |
|---|---|
| 1 | pattern – Der reguläre Ausdruck zum Matchen. |
| 2 | string – Der String, der irgendwo nach dem Muster durchsucht wird. |
| 3 | flags – Modifikatoren per bitweisem OR (|). |
re.search gibt bei Erfolg ein Match-Objekt zurück, bei Fehlschlag None. Nutzung von group(num) oder groups() analog zu match.
Beispiel
#!/usr/bin/python
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!!")
Ausgabe:
searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter
Matching versus Searching
Python bietet zwei primitive Operationen basierend auf regulären Ausdrücken:
- match – Prüft nur am Anfang des Strings.
- search – Prüft irgendwo im String (Perl-Standardverhalten).
Beispiel
#!/usr/bin/python
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!!")
Ausgabe:
No match!! search --> searchObj.group() : dogs
Suchen und Ersetzen
Eine der wichtigsten re-Methoden ist sub.
Syntax
re.sub(pattern, repl, string, max=0)
Ersetzt alle Vorkommen des RE-pattern in string mit repl, sofern max nicht begrenzt. Gibt den modifizierten String zurück.
Beispiel
#!/usr/bin/python
import re
phone = "2004-959-559 # This is Phone Number"
# Python-Style-Kommentare löschen
num = re.sub(r'#.*$', "", phone)
print("Phone Num :", num)
# Alles außer Ziffern entfernen
num = re.sub(r'\D', "", phone)
print("Phone Num :", num)
Ausgabe:
Phone Num : 2004-959-559 Phone Num : 2004959559
Reguläre Ausdrucks-Modifikator: Option Flags
Reguläre Ausdrucks-Literale können einen optionalen Modifikator enthalten. Mehrere Modifikatoren per exklusivem OR (|).
| Nr. | Modifikator & Beschreibung |
|---|---|
| 1 | re.I – Case-insensitives Matching. |
| 2 | re.L – Interpretiert Wörter gemäß aktueller Locale. Beeinflusst \w, \W, \b, \B. |
| 3 | re.M – $ matcht Zeilenende (nicht nur Stringende), ^ matcht Zeilenanfang (nicht nur Stringanfang). |
| 4 | re.S – Punkt (.) matcht jedes Zeichen, einschließlich Newline. |
| 5 | re.U – Interpretiert Buchstaben gemäß Unicode-Zeichensatz. Beeinflusst \w, \W, \b, \B. |
| 6 | re.X – Erlaubt „schönere“ Regex-Syntax. Ignoriert Whitespace (außer in [] oder escaped) und behandelt unescaped # als Kommentar. |
Reguläre Ausdrucks-Muster
Ausgenommen Steuerzeichen (+ ? . * ^ $ ( ) [ ] { } | \) matchen alle Zeichen sich selbst. Steuerzeichen können mit Backslash escaped werden.
Folgende Tabelle listet die in Python verfügbare Regex-Syntax:
| Nr. | Muster & Beschreibung |
|---|---|
| 1 | ^ – Matcht Zeilenanfang. |
| 2 | $ – Matcht Zeilenende. |
| 3 | . – Matcht jedes einzelne Zeichen außer Newline. Mit m-Option auch Newline. |
| 4 | [...] – Matcht einzelnes Zeichen in Klammern. |
| 5 | [^...] – Matcht einzelnes Zeichen nicht in Klammern. |
| 6 | re* – 0 oder mehr Vorkommen des vorangehenden Ausdrucks. |
| 7 | re+ – 1 oder mehr Vorkommen. |
| 8 | re? – 0 oder 1 Vorkommen. |
| 9 | re{n} – Genau n Vorkommen. |
| 10 | re{n,} – n oder mehr Vorkommen. |
| 11 | re{n,m} – Mindestens n, höchstens m Vorkommen. |
| 12 | a|b – Matcht entweder a oder b. |
| 13 | (re) – Gruppiert reguläre Ausdrücke und merkt gematchten Text. |
| 14 | (?imx) – Schaltet i, m, x Optionen temporär ein. In Klammern nur dort. |
| 15 | (?-imx) – Schaltet i, m, x Optionen temporär aus. In Klammern nur dort. |
| 16 | (?:re) – Gruppiert ohne Merken des gematchten Texts. |
| 17 | (?imx:re) – Schaltet i, m, x in Klammern ein. |
| 18 | (?-imx:re) – Schaltet i, m, x in Klammern aus. |
| 19 | (?#...) – Kommentar. |
| 20 | (?=re) – Position per Muster angeben. Kein Bereich. |
| 21 | (?!re) – Position per Muster-Negation. Kein Bereich. |
| 22 | (?>re) – Matcht unabhängiges Muster ohne Backtracking. |
| 23 | \w – Matcht Wortzeichen. |
| 24 | \W – Matcht Nicht-Wortzeichen. |
| 25 | \s – Matcht Whitespace. Äquivalent [\t\n\r\f]. |
| 26 | \S – Matcht Nicht-Whitespace. |
| 27 | \d – Matcht Ziffern. Äquivalent [0-9]. |
| 28 | \D – Matcht Nicht-Ziffern. |
| 29 | \A – Matcht Stringanfang. |
| 30 | \Z – Matcht Stringende. Falls Newline existiert, kurz davor. |
| 31 | \z – Matcht Stringende. |
| 32 | \G – Matcht Punkt, wo letzter Match endete. |
| 33 | \b – Wortgrenzen außerhalb Klammern. Backspace (0x08) innerhalb Klammern. |
| 34 | \B – Nicht-Wortgrenzen. |
| 35 | \n, \t, etc. – Newlines, Carriage Returns, Tabs, etc. |
| 36 | \1...\9 – n-te gruppierte Subexpression. |
| 37 | \10 – n-te gruppierte Subexpression, falls bereits gematcht; sonst Oktalcode. |
Reguläre Ausdrucks-Beispiele
Literalzeichen
| Nr. | Beispiel & Beschreibung |
|---|---|
| 1 | python – Matcht „python“. |
Zeichenklassen
| Nr. | Beispiel & Beschreibung |
|---|---|
| 1 | [Pp]ython – „Python“ oder „python“ |
| 2 | rub[ye] – „ruby“ oder „rube“ |
| 3 | [aeiou] – Beliebiger Kleinbuchstabe-Vokal |
| 4 | [0-9] – Beliebige Ziffer; gleich [0123456789] |
| 5 | [a-z] – Beliebiger ASCII-Kleinbuchstabe |
| 6 | [A-Z] – Beliebiger ASCII-Großbuchstabe |
| 7 | [a-zA-Z0-9] – Beliebiges der obigen Zeichen |
| 8 | [^aeiou] – Alles außer Kleinbuchstabe-Vokal |
| 9 | [^0-9] – Alles außer Ziffer |
Spezielle Zeichenklassen
| Nr. | Beispiel & Beschreibung |
|---|---|
| 1 | . – Beliebiges Zeichen außer Newline |
| 2 | \d – Ziffer: [0-9] |
| 3 | \D – Nicht-Ziffer: [^0-9] |
| 4 | \s – Whitespace: [ \t\r\n\f] |
| 5 | \S – Nicht-Whitespace: [^ \t\r\n\f] |
| 6 | \w – Einzelnes Wortzeichen: [A-Za-z0-9_] |
| 7 | \W – Nicht-Wortzeichen: [^A-Za-z0-9_] |
Wiederholungsfälle
| Nr. | Beispiel & Beschreibung |
|---|---|
| 1 | ruby? – „rub“ oder „ruby“: y optional |
| 2 | ruby* – „rub“ plus 0 oder mehr y |
| 3 | ruby+ – „rub“ plus 1 oder mehr y |
| 4 | \d{3} – Genau 3 Ziffern |
| 5 | \d{3,} – 3 oder mehr Ziffern |
| 6 | \d{3,5} – 3, 4 oder 5 Ziffern |
Nicht-gierige Wiederholung
Matcht die kleinste Anzahl von Wiederholungen:
| Nr. | Beispiel & Beschreibung |
|---|---|
| 1 | <.*> – Gierig: matcht „<python>perl>“ |
| 2 | <.*?> – Nicht-gierig: matcht „<python>“ in „<python>perl>“ |
Gruppierung mit Klammern
| Nr. | Beispiel & Beschreibung |
|---|---|
| 1 | \D\d+ – Keine Gruppe: + wiederholt \d |
| 2 | (\D\d)+ – Gruppiert: + wiederholt \D\d-Paar |
| 3 | ([Pp]ython(, )?)+ – „Python“, „Python, python, python“, etc. |
Backreferences
Matcht eine zuvor gematchte Gruppe erneut:
| Nr. | Beispiel & Beschreibung |
|---|---|
| 1 | ([Pp])ython&\1ails – „python&pails“ oder „Python&Pails“ |
| 2 | (['\"])[^\1]*\1 – Einfach oder doppelt gequoteter String. \1 matcht, was 1. Gruppe matchte. \2 matcht 2. Gruppe, etc. |
Alternativen
| Nr. | Beispiel & Beschreibung |
|---|---|
| 1 | python|perl – „python“ oder „perl“ |
| 2 | rub(y|le) – „ruby“ oder „ruble“ |
| 3 | Python(!+|\?) – „Python“ gefolgt von einem oder mehreren ! oder einem ? |
Anker
Match-Position festlegen:
| Nr. | Beispiel & Beschreibung |
|---|---|
| 1 | ^Python – „Python“ am Stringanfang oder internen Zeilenanfang |
| 2 | Python$ – „Python“ am Stringende oder Zeilenende |
| 3 | \APython – „Python“ am Stringanfang |
| 4 | Python\Z – „Python“ am Stringende |
| 5 | \bPython\b – „Python“ an Wortgrenze |
| 6 | \brub\B – \B ist Nicht-Wortgrenze: „rub“ in „rube“ und „ruby“, aber nicht allein |
| 7 | Python(?=!) – „Python“, wenn von ! gefolgt |
| 8 | Python(?!!) – „Python“, wenn nicht von ! gefolgt |
Spezielle Syntax mit Klammern
| Nr. | Beispiel & Beschreibung |
|---|---|
| 1 | R(?#comment) – Matcht „R“. Rest ist Kommentar |
| 2 | R(?i)uby – Case-insensitiv beim Matchen von „uby“ |
| 3 | R(?i:uby) – Gleich wie oben |
| 4 | rub(?:y|le) – Gruppieren ohne \1-Backreference |
Python
- Python-Datentypen meistern: Praxisleitfaden
- Python-Operatoren meistern: Umfassender Leitfaden
- Python pass-Statement meistern: Praxisleitfaden
- Python-Funktionsargumente meistern: Positional, Keyword & Default-Parameter
- Python-Dictionaries meistern: Erstellung, Manipulation und fortgeschrittene Techniken
- Python Iteratoren meistern: Funktionsweise und Erstellung eigener Iteratoren
- Python Closures erklärt: Wie verschachtelte Funktionen Variablen erfassen
- Python Reguläre Ausdrücke (re Modul) – Ein praktischer Leitfaden
- Python datetime meistern: Praktischer Leitfaden zu Datumsangaben, Zeiten und Zeitzonen
- Java Reguläre Ausdrücke: Pattern Matching mit java.util.regex meistern