1. Warum Reguläre Ausdrücke (Regex)?
Im echten Alltag eines Software-Entwicklers oder Data Engineers sind 80% aller Rohdaten unstrukturiert: E-Mails, Server-Logs, Tweets, Rechnungen oder Kundeneingaben.
Einfache String-Methoden wie .find() oder .split() reichen oft nicht aus.
Ein regulärer Ausdruck ist wie ein Phantombild:
Statt nach einem festen Text zu suchen („Suche exakt nach 'Peter'“), suchst du nach einer Struktur:
„Suche 2 Großbuchstaben, gefolgt von 2 Ziffern, gefolgt von weiteren Zahlen – egal welche Nummern es genau sind, das ist eine IBAN!“
2. Cheat-Sheet: Die wichtigsten Metazeichen & Quantifizierer
In Python nutzen wir das Modul import re. Regex-Muster werden als Raw-Strings (r"...") definiert:
| Zeichen | Kategorie | Bedeutung | Beispiel |
|---|---|---|---|
\d |
Metazeichen | Beliebige Ziffer (0-9) | r"\d{4}" → "2026" |
\w |
Metazeichen | Wortzeichen (Buchstabe, Ziffer, Unterstrich) | r"#\w+" → "#python" |
\s |
Metazeichen | Whitespace (Leerzeichen, Tab, Umbruch) | r"\s+" |
. |
Metazeichen | Beliebiges Zeichen (außer Zeilenumbruch) | r"a.c" → "abc", "a9c" |
+ |
Quantifizierer | Mindestens 1 Mal (1 bis unendlich) | r"\d+" → "42" |
* |
Quantifizierer | 0 oder mehrmals (optional beliebig oft) | r"ab*c" → "ac", "abc" |
? |
Quantifizierer | Optional (0 oder 1 Mal) | r"https?" → "http", "https" |
{min,max} |
Quantifizierer | Von min bis max Wiederholungen | r"\d{2,4}" |
^ und $ |
Anker | Zeilenanfang (^) und Zeilenende ($) |
r"^\d+$" (nur Ziffern) |
3. Die 4 Haupt-Methoden in Python
| Methode | Zweck | Code-Beispiel |
|---|---|---|
re.search() |
Sucht den ersten Treffer irgendwo im String. | m = re.search(r"\d+", "Raum 404") |
re.fullmatch() |
Prüft, ob der gesamte String dem Muster entspricht (Validierung). | re.fullmatch(r"^[a-z]+@[a-z]+\.[a-z]{2,}$", mail) |
re.findall() |
Sammelt alle Vorkommnisse in einer Python-Liste. | re.findall(r"#\w+", tweet) |
re.sub() |
Sucht Treffer und ersetzt sie (auch per Lambda/Funktion). | re.sub(r"\d", "*", "Pin: 1234") → "Pin: ****" |
Mit benannten Gruppen kannst du Daten direkt in ein lesbares Dictionary extrahieren:
import re pattern = r"^(?P<jahr>\d{4})-(?P<monat>\d{2})-(?P<tag>\d{2})$" match = re.fullmatch(pattern, "2026-08-29") if match: print(match.groupdict()) # Output: {'jahr': '2026', 'monat': '08', 'tag': '29'}
4. 📋 Deine Aufgaben-Checkliste
Öffne die Datei aufgabe.py und löse die 5 Teilziele:
💡 Lösungshinweise (Aufklappen bei Bedarf)
🔍 Tipp zu TODO 4: IBAN-Maskierung mit Lambda
Übergebe an re.sub() eine Funktion, die das Match-Objekt zerlegt:
pattern = r"\b([A-Z]{2}\d{2})([A-Z0-9]{8,30})\b" return re.sub( pattern, lambda m: m.group(1) + ("*" * len(m.group(2))), text )
🔍 Tipp zu TODO 5: ISO-Datum mit benannten Gruppen
Nutze re.fullmatch und groupdict():
pattern = r"^(?P<jahr>\d{4})-(?P<monat>\d{2})-(?P<tag>\d{2})$" match = re.fullmatch(pattern, datum_str.strip()) if not match: raise ValueError("Ungültiges Format") return match.groupdict()
5. 🧪 Lösung überprüfen & Testen
1. Automatische Tests ausführen:
python3 test_aufgabe.py
2. Interaktives Skript starten:
python3 aufgabe.py
🧠 Diagnostischer Selbst-Check
Überprüfe dein Verständnis der Kernkonzepte und typischen Denkfallen, bevor du den Code in der Web-IDE schreibst.