R

ReflexKR

Reflex-Dokumentation

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

Reguläre Ausdrücke zum Ansehen
Lektion 1

Zeit 0:00–0:50

Die verschwundene Zahlung: Text wörtlich finden

CASE-001

Grep & Co. Datendetektei

Fallakte

Die verschwundene Zahlung

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 lost

1-1. Ein Regex ist ein „Zeichenmuster“ (5 Min.)

Ein 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.
  • Wird es gefunden, bekommst du ein Match-Objekt zurück, sonst None.

Beweislabor

re.search(r"", text)

Rückgabewert

Wechsle zwischen search und findall. search findet nur den ersten Treffer, findall alle.

1-2. Gefunden – und wo? Das Match-Objekt (5 Min.)

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)
  • Mit if m: prüfst du direkt auf wahr oder falsch. Wurde nichts gefunden, ist m gleich None, und m.group() wirft einen AttributeError.
  • Die Endposition von span() ist nicht enthalten. Das ist dieselbe Regel, nach der log[20:25] genau "ERROR" ergibt.
  • Im Feld „Erster Treffer“ des Beweislabors siehst du genau diese Werte.

1-3. Die 14 Sonderzeichen (10 Min.)

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

a.c passt nur, wenn zwischen a und c genau ein Zeichen steht.

1-4. Mit dem Backslash die Sonderbedeutung abschalten (10 Min.)

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

Fang mit 4.99 an und füge nacheinander \. und \$ ein. Geschafft ist es, wenn alle Fallbedingungen grün sind.

1-5. Warum r"...": Raw-Strings (5 Min.)

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ändert
  • r"..." lässt die Backslashes in Ruhe und reicht sie unverändert an re weiter. Regexe schreibst du immer als Raw-String.
  • Seit Python 3.12 gibt es eine SyntaxWarning, wenn in einem normalen String eine Escape-Sequenz steht, die Python nicht kennt, etwa "\d". Mit einem Raw-String bleibt die Warnung aus.

1-6. Eingaben von Gästen wörtlich suchen: re.escape (5 Min.)

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+")    # Treffer

Den Fall lösen (10 Min.)

Fassen 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=TIMEOUT

Fall 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.

Übungen

  1. Finde im Log alle Zeilen mit INFO. Wie viele sind es?
  2. Was findet \$1.\.99? Überleg es dir erst, bevor du es im Labor ausprobierst.
  3. Überleg dir, was 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.

← Zurück

Kursüberblick

Weiter →

Lektion 2 · Der Fluchtwagen: Zeichenklassen

Über neue Lektionen informiert werden

Wir schicken dir eine E-Mail, wenn dieser Kurs neue Lektionen bekommt oder ein Folgekurs erscheint.

Erhoben: deine E-Mail-Adresse · Zweck: Hinweise auf neue Lektionen oder den Start dieses Kurses · Speicherdauer: bis du die Löschung verlangst. Keine andere Nutzung, keine Weitergabe. Antworte einfach auf eine Benachrichtigung, dann löschen wir sie sofort.

Fragen & Antworten

Frag alles zu dieser Lektion. Fragen aus allen Sprachversionen dieser Seite erscheinen hier gemeinsam.

Wird als reiner Text angezeigt, ohne Links oder Formatierung.

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
한국어English日本語简体中文EspañolDeutsch

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex