Reguläre Ausdrücke: Textmuster finden mit Regex
Regex sieht kryptisch aus, ist aber ein mächtiges Werkzeug: Lerne, wie du mit regulären Ausdrücken in Python und JavaScript Textmuster findest, validierst und ersetzt.
Ob du E-Mail-Adressen validieren, Logdateien durchsuchen oder Telefonnummern aus einem Text extrahieren willst – irgendwann stößt du auf reguläre Ausdrücke (kurz: Regex). Auf den ersten Blick wirken sie wie kryptische Zeichensalate, doch dahinter steckt ein logisches System, das du Schritt für Schritt lernen kannst. In diesem Beitrag schauen wir uns die wichtigsten Bausteine an und setzen sie in Python und JavaScript praktisch ein.
Was sind reguläre Ausdrücke?
Ein regulärer Ausdruck ist eine Beschreibung eines Textmusters. Statt nach einem festen String wie "2024" zu suchen, beschreibst du mit Regex eine ganze Klasse von Strings – zum Beispiel „vier Ziffern hintereinander“ mit \d{4}. Eine Regex-Engine prüft dann, ob und wo dieses Muster in einem Text vorkommt.
Das Schöne daran: Die Grundsyntax ist in fast allen Sprachen gleich. Was du einmal lernst, kannst du in Python, JavaScript, Java, SQL oder direkt auf der Kommandozeile mit grep anwenden.
Die wichtigsten Bausteine
Regex besteht aus wenigen Grundelementen, die sich beliebig kombinieren lassen:
- Zeichenklassen:
\dsteht für eine Ziffer,\wfür ein Wortzeichen (Buchstabe, Ziffer, Unterstrich),\sfür Whitespace. Der Punkt.matcht ein beliebiges Zeichen. - Eigene Klassen:
[abc]matcht a, b oder c;[a-z]einen Kleinbuchstaben;[^0-9]alles außer Ziffern. - Quantifizierer:
+bedeutet „einmal oder öfter“,*„null Mal oder öfter“,?„optional“,{2,4}„zwei bis vier Mal“. - Anker:
^markiert den Anfang,$das Ende eines Strings – wichtig für Validierungen. - Alternativen:
katze|hundmatcht „katze“ oder „hund“.
Damit kannst du schon erstaunlich viel ausdrücken: ^\d{5}$ beschreibt zum Beispiel eine deutsche Postleitzahl – genau fünf Ziffern, nichts davor, nichts danach.
Regex in Python: das re-Modul
In Python bringt das eingebaute Modul re alles mit, was du brauchst. Die wichtigsten Funktionen sind search (findet den ersten Treffer), findall (findet alle Treffer) und fullmatch (prüft den kompletten String):
import re
text = "Bestellung 4711 vom 07.07.2026, Rechnung 8842 folgt."
# Alle Zahlen finden
nummern = re.findall(r"\d+", text)
print(nummern) # ['4711', '07', '07', '2026', '8842']
# Ein Datum im Format TT.MM.JJJJ suchen
datum = re.search(r"\d{2}\.\d{2}\.\d{4}", text)
if datum:
print(datum.group()) # 07.07.2026
# Validierung: Ist das eine Postleitzahl?
print(bool(re.fullmatch(r"\d{5}", "50667"))) # True
print(bool(re.fullmatch(r"\d{5}", "123"))) # FalseZwei Details sind wichtig: Nutze immer Raw Strings (r"..."), damit Python Backslashes nicht selbst interpretiert. Und beachte, dass der Punkt in \d{2}\.\d{2} escaped ist – sonst würde er jedes beliebige Zeichen matchen.
Gruppen: Teile eines Treffers extrahieren
Mit runden Klammern definierst du Gruppen und kannst so einzelne Teile eines Musters gezielt herausziehen. Noch lesbarer wird es mit benannten Gruppen:
import re
log = "2026-07-07 14:32:10 ERROR Datenbankverbindung fehlgeschlagen"
muster = r"(?P<datum>\d{4}-\d{2}-\d{2}) (?P<zeit>[\d:]+) (?P<level>\w+) (?P<nachricht>.+)"
treffer = re.search(muster, log)
if treffer:
print(treffer.group("datum")) # 2026-07-07
print(treffer.group("level")) # ERROR
print(treffer.group("nachricht")) # Datenbankverbindung fehlgeschlagenSo zerlegst du mit einer einzigen Zeile Regex eine komplette Logzeile in ihre Bestandteile – ein Muster, das dir bei der Auswertung von Serverlogs oder CSV-ähnlichen Daten ständig begegnet.
Regex in JavaScript
In JavaScript sind reguläre Ausdrücke direkt in die Sprache eingebaut. Du schreibst sie zwischen zwei Schrägstriche und hängst optional Flags an – g für „alle Treffer“ und i für „Groß-/Kleinschreibung ignorieren“:
const text = "Kontakt: anna@example.com oder max@firma.de";
// Alle E-Mail-Adressen finden
const emails = text.match(/[\w.-]+@[\w.-]+\.\w{2,}/g);
console.log(emails); // ['anna@example.com', 'max@firma.de']
// Validierung mit test()
const plzRegex = /^\d{5}$/;
console.log(plzRegex.test("50667")); // true
console.log(plzRegex.test("abc")); // false
// Suchen und Ersetzen: Datumsformat umdrehen
const datum = "07.07.2026";
const iso = datum.replace(/(\d{2})\.(\d{2})\.(\d{4})/, "$3-$2-$1");
console.log(iso); // 2026-07-07Besonders praktisch ist replace in Kombination mit Gruppen: Über $1, $2 und $3 greifst du im Ersetzungsstring auf die gefundenen Teile zu und kannst so Formate mit einer Zeile Code umbauen.
Typische Stolperfallen
Regex ist mächtig, aber es gibt ein paar Dinge, die dir am Anfang Kopfzerbrechen bereiten können:
- Gierige Quantifizierer:
.*matcht so viel wie möglich. Bei"<b>fett</b> und <i>kursiv</i>"würde<.*>alles von der ersten bis zur letzten spitzen Klammer erfassen. Die Lösung:<.*?>mit Fragezeichen macht den Quantifizierer „genügsam“ (lazy). - Sonderzeichen vergessen zu escapen: Zeichen wie
.,+,(oder?haben eine Spezialbedeutung. Willst du sie wörtlich matchen, brauchst du einen Backslash davor. - Zu komplexe Muster: Wenn deine Regex länger als eine Zeile wird, ist oft normaler Code die bessere Wahl. Regex ergänzt Stringmethoden, ersetzt sie aber nicht.
Ein guter Workflow: Teste deine Muster interaktiv, zum Beispiel auf regex101.com. Dort siehst du live, was matcht, und bekommst jede Komponente deines Ausdrucks erklärt.
Fazit
Reguläre Ausdrücke sind eines der Werkzeuge mit dem besten Verhältnis von Lernaufwand zu Nutzen: Ein Nachmittag Übung, und du kannst Texte durchsuchen, validieren und umformen, wofür du sonst dutzende Zeilen Schleifencode bräuchtest. Fang mit einfachen Mustern wie Zeichenklassen und Quantifizierern an, nutze Gruppen zum Extrahieren von Daten und greife bei Unklarheiten zu einem Online-Tester. Je öfter du Regex einsetzt, desto schneller kannst du die Muster fließend lesen – und irgendwann schreibst du ^\d{5}$ ganz selbstverständlich, ohne nachzudenken.