- 1 Section
- 10 Lessons
- unbegrenzt
- Reguläre Ausdrücke & Textverarbeitung10
- 1.1Was sind Reguläre Ausdrücke?
- 1.2Grundzeichen: Literale, Zeichenklassen, Quantoren
- 1.3Anker, Gruppen und Alternation
- 1.4Gierige vs. faule Quantoren
- 1.5Regex in Python: re-Modul
- 1.6Regex in JavaScript
- 1.7grep, sed, awk – Regex auf der Kommandozeile
- 1.8Regex für Validierung: E-Mail, IP, PLZ, Datum
- 1.9Regex in Datenbanken: LIKE, REGEXP
- 1.10Aufgaben Reguläre Ausdrücke
Regex in Python: re-Modul
Du hast in den ersten vier Lektionen die Regex-Sprache gelernt – die Zeichen, Quantoren, Anker, Gruppen. Jetzt geht's um die Anwendung in einer konkreten Programmiersprache: Python. Pythons eingebautes re-Modul ist eine der elegantesten Regex-Implementierungen überhaupt – kompakt, mächtig, gut dokumentiert.
Diese Lektion ist deine Referenz für Python: welche Funktionen es gibt, wann du welche nimmst, was die Fallstricke sind. Außerdem: Raw-Strings, eine Python-Spezialität die du beim Regex-Schreiben fast immer brauchen wirst. Wer das nicht weiß, kämpft ständig mit verdoppelten Backslashes.
1) Das re-Modul importieren
Anders als JavaScript hat Python keine eingebaute Regex-Syntax mit Slashes. Stattdessen ist Regex eine ganz normale Standard-Library:
Drei Dinge in diesem Mini-Beispiel:
import re– das Modul laden. Standard-Library, keinpip installnötig.re.search(pattern, text)– durchsucht den Text. Gibt ein Match-Objekt zurück oderNone.r"\d+"– Raw-String. Dasrvor dem String sagt Python: „behandle Backslashes wörtlich, nicht als Escape". Ohne dasrmüsstest du"\\d+"schreiben.
2) Raw-Strings: Pflichtwissen für Python-Regex
Das wichtigste Konzept aus dieser Lektion. Normale Python-Strings interpretieren Backslashes als Escape-Sequenzen: \n ist ein Newline, \t ein Tab. Aber in Regex ist \n auch ein Newline (zufällig gleich), während \d für „Ziffer" steht – Python kennt aber kein \d-Escape. Das wäre ungültig.
Lösung: Raw-Strings mit Präfix r:
| Schreibweise | Python sieht | Regex bekommt |
|---|---|---|
"\d+" | ⚠ Warnung (ungültiges Escape) | \d+ – matched eine Ziffer (Glück) |
"\\d+" | \d+ (doppelte Backslashes) | \d+ ✓ |
r"\d+" | \d+ (Raw, kein Escape) | \d+ ✓ |
Die Raw-Variante ist klarer lesbar – du schreibst genau das was die Regex haben soll, ohne Backslash-Verdoppelung. Goldregel: Regex in Python immer als Raw-String schreiben. r"..." – wird zur Gewohnheit.
\n wörtlich Backslash-n, nicht ein Newline-Zeichen! Wenn du Python tatsächlich einen Newline einfügen willst (nicht als Regex-Pattern), nimm einen normalen String. Innerhalb des Patterns wird \n dann von der Regex-Engine als Newline verstanden – das passt. Bei Regex-Patterns ist Raw quasi immer richtig.3) Die fünf Hauptfunktionen
Das re-Modul hat eine Handvoll Hauptfunktionen für die häufigen Operationen. Hier die wichtigsten – jede löst ein anderes Problem:
^-Anker. Gibt Match-Objekt oder None.repl. Repl kann String mit \1-Backrefs sein oder Funktion..split() aber mit Regex als Trenner.^...$. Ideal für Validierung.fullmatch (das Pattern muss alles abdecken). Suchen ob's da ist → search. Alle Treffer holen → findall (Strings) oder finditer (mit Positionen). Text umwandeln → sub. Trennen → split. match ist eine Anfänger-Falle: viele denken es „matched den Text", tatsächlich nur „am Anfang". Im Zweifelsfall lieber search oder fullmatch.4) Match-Objekte ausnutzen
Wenn match/search/finditer einen Treffer liefern, bekommst du ein Match-Objekt. Das hat mehrere nützliche Methoden:
Sehr praktisch: du bekommst nicht nur den Match-Text, sondern auch die Position im Original. Damit kannst du den Text vor/nach dem Match weiterverarbeiten, oder mehrere Matches mit Positionen kombinieren.
5) Named Groups in Python
Wie in L3 gezeigt: Named Groups machen Code lesbarer. Python-Syntax: (?P<name>...) mit großem P (Python-spezifisch):
Ideal für Parser-Code wo du strukturierte Daten extrahierst. groupdict() gibt direkt ein Dictionary zurück – passt perfekt zu JSON-Verarbeitung.
6) Interaktiver Python-Tester
Probier die Methoden direkt aus. Wähle eine Funktion, gib Pattern und Text an, sieh den Python-Output direkt:
search findet ersten Treffer egal wo. match matched nur ab Position 0 – „42" wird nicht gefunden wenn am Anfang „Anna" steht. fullmatch verlangt dass das Pattern den ganzen Text matched – perfekt für Eingabevalidierung. findall liefert Liste aller Treffer. sub ersetzt, split teilt am Pattern.7) re.sub: Ersetzungen mit Power
Die sub-Funktion ist eine der mächtigsten – sie ersetzt Treffer durch beliebiges. Drei Stufen der Mächtigkeit:
1. Einfacher String-Ersatz:
2. Backreferences nutzen: in Python mit \1, \2 oder \g<name>:
3. Funktion als Ersatz: für komplexe Logik gibst du eine Funktion mit. Sie bekommt das Match-Objekt und gibt den Ersatz zurück:
Diese Function-Variante ist extrem mächtig – fast schon ein Mini-Template-Engine. Du kannst auf den Match zugreifen, Berechnungen durchführen, externe Daten nachschlagen.
8) Flags: Verhalten steuern
Wie in JavaScript hat Python Flags die das Match-Verhalten ändern. Du übergibst sie als optionales Argument (mehrere mit | verknüpft):
| Flag | Kurz | Wirkung |
|---|---|---|
re.IGNORECASE | re.I | Case-insensitive – Groß/Kleinschreibung ignorieren |
re.MULTILINE | re.M | ^/$ matchen Zeilenanfang/-ende statt String-Grenzen |
re.DOTALL | re.S | . matched auch Newline |
re.VERBOSE | re.X | Whitespace im Pattern ignorieren (für Lesbarkeit) |
re.ASCII | re.A | \w nur ASCII (kein Unicode) |
re.UNICODE | re.U | Unicode-Matching (Standard in Python 3) |
Besonders nützlich: re.VERBOSE. Damit kannst du komplexe Patterns über mehrere Zeilen mit Kommentaren schreiben:
Mit re.VERBOSE werden Whitespace und #-Kommentare im Pattern ignoriert. Dadurch wird auch ein komplexer Regex lesbar. Wer Patterns für andere wartbar machen will: re.VERBOSE nutzen.
9) Pattern vorab kompilieren
Wenn du dasselbe Pattern oft verwendest, kompiliere es einmal mit re.compile():
Vorteile: Performance (Pattern wird nur einmal geparst), Lesbarkeit (Pattern hat einen Namen), wiederverwendbar. In Hot-Loops mit vielen Iterationen lohnt sich das immer.
Pythons re-Modul cachet zwar auch unkompilierte Patterns automatisch – aber die Lesbarkeit gewinnt allein schon weil das Pattern zentral steht.
10) Praxis-Beispiel: Log-Parser
Ein realistisches Beispiel das viele Konzepte verbindet. Wir parsen Log-Zeilen aus einer Webapp:
Mit Named Groups, lazy Quantor, optionaler Non-Capturing-Group, VERBOSE-Modus – ein typisches Praxis-Pattern. Im echten Log-Parsing für eine Logging-Anwendung ist diese Methodik Standard. Mehr Details zur Validierung in L8.
11) Häufige Python-spezifische Stolperfallen
Sachen die in Python-Regex anders sind als anderswo – darauf achten:
- match() vs. search(): match prüft nur am Anfang, search überall. Anfänger nutzen oft match, wundern sich warum Pattern
\d+auf „Anna 42" nichts findet. Lösung: search nutzen oder Pattern mit.*?davor anpassen. - Raw-String vergessen:
"\b"ist in Python ein Backspace-Zeichen (ASCII 8), nicht ein Regex-Wortgrenzen-Anker! Mitr"\b"klappt's. Python 3.12+ warnt bei „invalid escape sequence". - findall mit Gruppen: bei einer Gruppe gibt findall die Gruppe zurück, nicht den ganzen Match. Bei mehreren Gruppen ein Tupel. Bei null Gruppen den ganzen Match. Verwirrend! Lieber
finditerfür vorhersagbares Verhalten. - None statt False:
re.searchgibtNonebei nicht-Match zurück (nicht False). In if-Bedingung trotzdem ok, weil None falsy ist. - Unicode: in Python 3 ist
\wstandardmäßig Unicode – matched also auch ä, ö, ü und chinesische Zeichen. Wer nur ASCII will:re.ASCII-Flag.
12) Performance-Tipps
Regex in Python ist sehr schnell wenn richtig genutzt – aber es gibt Fallen:
- Compile cache:
recacht die letzten ~512 Patterns automatisch. Bei vielen verschiedenen Patterns kann der Cache überlaufen →re.compilenutzen. - Anchor wenn möglich:
^patternist schneller alspatternwenn du nur am Anfang prüfen willst – Engine bricht früher ab. - Vermeiden: katastrophales Backtracking (siehe L4). Geschachtelte Quantoren wie
(a+)+sind gefährlich. - String-Methoden bevorzugen wenn keine Regex nötig:
"foo" in textist viel schneller alsre.search("foo", text). Regex nur wenn du Patterns brauchst. - regex-Library als Alternative: Pythons Drittanbieter-Library
regex(PyPI) ist mächtiger alsre– unterstützt z.B. variable-length lookbehind. Bei komplexen Patterns sinnvoll.
Zusammenfassung
Pythons re-Modul: immer Raw-Strings r"..." nutzen, sonst Backslash-Hölle. Hauptfunktionen: re.search (irgendwo), re.match (nur am Anfang!), re.fullmatch (ganzer Text – ideal für Validierung), re.findall (alle Treffer), re.finditer (mit Match-Objekten), re.sub (ersetzen, String oder Funktion als Ersatz), re.compile (wiederverwendbar). Named Groups: (?P<name>...) mit P. Flags: re.IGNORECASE, re.MULTILINE, re.DOTALL, re.VERBOSE (Kommentare im Pattern für komplexe Regex).
