Reguläre Ausdrücke zum Ansehen
·
Kursüberblick
1
Die verschwundene Zahlung: Text wörtlich finden
2
Der Fluchtwagen: Zeichenklassen
3
Das zerrissene Telefonbuch: Quantoren
4
Die falschen Anmeldungen: Anker und Validierung
5
Daten in jedem Format: Gruppen und Alternativen
6
Der Zugriff um 3 Uhr nachts: benannte Gruppen und Match-Objekte
7
Die Nacht vor der Story: Ersetzen und Aufteilen
8
Die Herausforderung des Backtrackers: gierig, genügsam, possessiv
9
Die Regeln des Tresors: Lookaround
10
Gleiche Masche: Rückverweise und Bedingungen
11
Der unlesbare Regex: Flags und Kompilieren
12
Die Enttarnung des Backtrackers: Rückblick und ein Tokenizer
Zeit 0:00–0:50
CASE-001
Grep & Co. Datendetektei
Fallakte
Auftraggeber
Der Betreiber des PC-Cafés „Level Up“
Beweismittel
Das Log des Zahlungsservers. Ein Gast beschwert sich: Er hat 4,99 Dollar bezahlt, aber die Zahlung taucht nirgends auf.
Zum Abschluss des Falls
Finde im Log die Zeilen mit Fehlern und fische genau die Zahlungen über $4.99 heraus.
Erster Arbeitstag, morgens. Die Chefin stellt ihre Kaffeetasse ab und schiebt dir ein Blatt Papier hin. „Gestern war der Betreiber vom PC-Café da. Ein Gast sagt, er hat 4,99 Dollar bezahlt, aber es gibt keinen Eintrag. Logs lügen nicht. Such.“
So sieht das Log aus. Heute suchst du in diesen fünf Zeilen nach Beweisen.
2026-10-20 09:12:01 INFO PAY user=kim amount=$4.99 status=OK
2026-10-20 09:12:07 INFO PAY user=lee amount=$14.99 status=OK
2026-10-20 09:13:44 ERROR PAY user=park amount=$4.99 status=TIMEOUT
2026-10-20 09:15:02 INFO PAY user=choi amount=$4999 status=OK
2026-10-20 09:16:30 ERROR DB connection lostEin regulärer Ausdruck (regular expression, kurz Regex) ist eine kleine Sprache, in der du die Form der Zeichen aufschreibst, die du suchst. In Python benutzt du dafür das Modul re. Der einfachste Regex besteht aus ganz normalen Zeichen: Das Muster ERROR findet den Text ERROR.
import re
log = "2026-10-20 09:13:44 ERROR PAY user=park"
m = re.search("ERROR", log)
print(m) # <re.Match object; span=(20, 25), match='ERROR'>re.search(muster, text) durchsucht den Text von vorn und findet die erste Stelle, an der das Muster vorkommt.None.Beweislabor
re.search(r"", text)
Rückgabewert
Das Match-Objekt ist der Beweis, dass etwas gefunden wurde, und zugleich ein Bericht darüber, was wo gefunden wurde.
m = re.search("ERROR", log)
if m: # wahr, wenn gefunden; None ist falsch
print(m.group()) # ERROR (der gefundene Text)
print(m.span()) # (20, 25) (Startposition, Endposition)if m: prüfst du direkt auf wahr oder falsch. Wurde nichts gefunden, ist m gleich None, und m.group() wirft einen AttributeError.span() ist nicht enthalten. Das ist dieselbe Regel, nach der log[20:25] genau "ERROR" ergibt.Die meisten Zeichen finden einfach sich selbst. Die folgenden 14 aber haben im Regex eine besondere Bedeutung. Man nennt sie Metazeichen.
. ^ $ * + ? { } [ ] \ | ( )Heute lernst du nur das erste davon: .. Der Punkt steht für ein beliebiges Zeichen außer dem Zeilenumbruch. Die übrigen holen wir in den nächsten Lektionen nach und nach hervor.
re.search("a.c", "abc") # Treffer: b sitzt an der Stelle des .
re.search("a.c", "a-c") # Treffer: auch - ist ein beliebiges Zeichen
re.search("a.c", "ac") # None: . braucht immer genau ein Zeichen
re.search("a.c", "a\nc") # None: ein Zeilenumbruch ist kein .Dots Tipp
Ich klettere überallhin: auf Schreibtische, auf Stühle, sogar auf die Tastatur der Chefin. Nur über eins komme ich nicht: das Fenster (den Zeilenumbruch). Deshalb heiße ich Dot, wie der Punkt (.). Angeblich komme ich rüber, wenn mir irgendwann jemand das Fenster aufmacht.
Beweislabor
re.search(r"", text)
Rückgabewert
Zurück zum Fall. Nimm an, die fünf Logzeilen von oben stecken im String pay_log. Was passiert, wenn du nach der Zahlung über 4,99 Dollar mit 4.99 suchst?
re.findall("4.99", pay_log) # ['4.99', '4.99', '4.99', '4999'] ← vier Stück?Zwei Treffer sollten es sein, vier sind es. Der hintere Teil 4.99 von $14.99 wurde erwischt, und weil . „ein beliebiges Zeichen“ ist, ist sogar 4999 aus $4999 mit dabei. Willst du ein Metazeichen wörtlich finden, stellst du einen Backslash \ davor. \. ist ein echter Punkt.
Auch $ ist ein Metazeichen. Was es bedeutet, lernst du in Lektion 4. Merk dir für jetzt nur: So hingeschrieben findet es kein Dollarzeichen. Die richtige Antwort lautet deshalb \$4\.99.
re.findall(r"\$4\.99", pay_log) # ['$4.99', '$4.99']Beweislabor
re.search(r"", text)
Rückgabewert
Oben stand vor den Anführungszeichen ein r, also r"\$4\.99". So etwas nennt man einen Raw-String.
Der Backslash ist auch in normalen Python-Strings etwas Besonderes: "\n" ist ein Zeilenumbruch, "\t" ein Tabulator. Schreibst du einen Regex als normalen String, deutet Python die Backslashes zuerst selbst, und re bekommt ein ganz anderes Muster als gedacht.
print(len("\b")) # 1 ← Python hat \b in ein einzelnes Backspace-Zeichen verwandelt
print(len(r"\b")) # 2 ← Backslash und b, zwei Zeichen, unverändertr"..." lässt die Backslashes in Ruhe und reicht sie unverändert an re weiter. Regexe schreibst du immer als Raw-String."\d". Mit einem Raw-String bleibt die Warnung aus.Der Betreiber des PC-Cafés sagt: „Der Benutzername des Gasts ist kim.99+. Such den bitte auch.“ Schreibst du so etwas direkt als Muster, werden . und + als Metazeichen gelesen. Wenn du von Menschen eingegebenen Text wörtlich suchen willst, setzt re.escape vor jedes Metazeichen einen Backslash.
print(re.escape("kim.99+")) # kim\.99\+
re.search(re.escape("kim.99+"), "user=kim.99+") # TrefferFassen wir zusammen: Die Zeilen mit Fehlern findest du mit ERROR, die Zahlungen über genau 4,99 Dollar mit \$4\.99. Legst du beide Bedingungen übereinander, kommt ans Licht, dass die Zahlung von Gast park wegen eines TIMEOUT-Fehlers nicht verbucht wurde.
for line in pay_log.splitlines():
if re.search("ERROR", line) and re.search(r"\$4\.99", line):
print(line)
# 2026-10-20 09:13:44 ERROR PAY user=park amount=$4.99 status=TIMEOUTFall abgeschlossen — Der Zahlungsserver hat die Zahlung um 09:13:44 wegen Zeitüberschreitung als fehlgeschlagen verbucht, auf dem Bildschirm des Gasts wurde sie aber als abgeschlossen angezeigt. Dem Betreiber des PC-Cafés wurde eine Erstattung empfohlen.
INFO. Wie viele sind es?\$1.\.99? Überleg es dir erst, bevor du es im Labor ausprobierst.re.escape("1+1=2? [yes]") ergibt, und führe es dann selbst aus.Das Notizbuch der Direktorin
Die meisten Zeichen finden sich selbst. Nur die 14 Metazeichen . ^ $ * + ? { } [ ] \ | ( ) sind besonders.
. ist ein beliebiges Zeichen außer dem Zeilenumbruch. Ein echter Punkt ist \.
re.search liefert ein Match oder None. Prüfen mit if m:, ansehen mit m.group() und m.span().
Regexe immer als Raw-String r"..." schreiben.
Von Menschen eingegebenen Text wörtlich suchen: re.escape.
Über neue Lektionen informiert werden
Wir schicken dir eine E-Mail, wenn dieser Kurs neue Lektionen bekommt oder ein Folgekurs erscheint.
R
ReflexKR
Python und Reflex zum Anfassen. Alle Beispiele wurden mit Reflex 0.10.0 ausgeführt und geprüft.
ReflexKR ist kostenlos und ohne Werbebanner. Wenn es dir geholfen hat, kannst du es mit einem Kaffee unterstützen. ☕ Spendier uns einen Kaffee
Hinweis zu Affiliate-Links© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
Fragen & Antworten
Frag alles zu dieser Lektion. Fragen aus allen Sprachversionen dieser Seite erscheinen hier gemeinsam.