Kapitel 17 • Data Engineering Track

Reguläre Ausdrücke (re) – Text-Mining & Validierung 🔍🕵️

Werde zum Muster-Detektiv! Durchsuche, filtere und validiere unstrukturierte Textdaten mit Pythons mächtiger Regex-Engine.

📂 Dateien dieser Einheit:
📄 aufgabe.py (Startercode) 🧪 test_aufgabe.py (Tests) 💡 musterloesung.py (Lösung) 📖 README.md

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.

🕵️ Die Detektiv-Analogie mit der Suchlupe:

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: ****"
💡 Benannte Gruppen mit (?P<name>...):

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:

Terminal (im Ordner 17_regulaere_ausdruecke_re)
python3 test_aufgabe.py

2. Interaktives Skript starten:

Terminal
python3 aufgabe.py