Direkt zum Hauptinhalt springen
eLearner.app
Modul 8 · Lektion 4 von 432/36 im Kurs~12 min
Lektionen des Moduls (4/4)

re-Modul: Regex in Python

Das Modul re stellt reguläre Ausdrücke in Python bereit. Wenn du bereits den Regex-Kurs auf dieser Website absolviert hast, wird dir die gesamte Syntax vertraut sein; hier werfen wir einen Blick auf die APIs.

Raw-String: r"..."

Reguläre Ausdrücke verwenden viele Backslashes (\d, \b, \s). Schreibe sie immer als Raw-Strings, damit du sie nicht verdoppeln musst:

Python
import re
# raw: \d is a single token
pattern = r"\d+"
# NOT raw: you would have to write "\\d+" otherwise Python interprets \d as "d"

re.search: Das erste Vorkommen finden

Python
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group()    # '42'
m.start()    # 3
m.end()      # 5

Gibt ein Match-Objekt zurück, wenn es gefunden wurde, andernfalls None. Idiomatisches Muster:

Python
if m := re.search(r"\d+", testo):
    print(m.group())

re.match: Nur am Anfang des Strings

Python
re.match(r"\d+", "42 anni")     # match!
re.match(r"\d+", "ho 42 anni")  # None (doesn't start with a digit)

Verwende zum Suchen an beliebiger Stelle bevorzugt re.search.

re.findall: Alle Vorkommen

Python
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']

Wenn das Muster Erfassungsgruppen (capture groups) enthält, gibt findall die Gruppen zurück, nicht den gesamten Treffer:

Python
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]

re.sub: Ersetzung

Python
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'

Er funktioniert auch mit einer Ersetzungsfunktion (die das Match erhält):

Python
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'

Benannte Gruppen

Python
m = re.search(r"(?P<anno>\d{4})-(?P<mese>\d{2})-(?P<giorno>\d{2})", "2025-01-15")
m.group("anno")    # '2025'
m.groupdict()      # {'anno': '2025', 'mese': '01', 'giorno': '15'}

Nützliche Flags

Python
re.search(r"ciao", "CIAO", re.IGNORECASE)       # case-insensitive
re.findall(r"^.+$", testo, re.MULTILINE)        # ^/$ match every line
re.search(r"a.b", "a\nb", re.DOTALL)            # . matches newline too

re.finditer für Speichersicherheit

Wenn du Treffer in einem riesigen Textblock verarbeiten musst, re.findall belegt eine Liste im Speicher, die alle extrahierten Treffer-Strings enthält. Es wird empfohlen, re.finditer() zu verwenden, das einen Lazy-Iterator von Match-Objekten zurückgibt und so minimalen Speicher verbraucht.

Probiere es aus

Übung#python.m8.l4.e1
Versuche: 0Wird geladen…

Extrahiere aus `text = 'ordine #123, totale €45.50, ricevuta #456'` ALLE Bestellnummern (die Ziffern nach #) als Liste von Strings in `orders`. Evaluiere `orders`.

Editor wird geladen…
Hinweis anzeigen

re.findall(r"#(\d+)", text) — Erfassungsgruppe nur für Ziffern.

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#python.m8.l4.e2
Versuche: 0Wird geladen…

Ersetze in `s = 'tel: 06-12345678 e tel: 02-9876'` alle Telefonnummern (Format \d+-\d+) durch den String 'XXX' und weise das Ergebnis `masked` zu. Evaluiere `masked`.

Editor wird geladen…
Hinweis anzeigen

re.sub(r"\d+-\d+", "XXX", s)

Lösung nach 3 Versuchen verfügbar

Zusätzliche Herausforderung

Übung#python.m8.l4.e3
Versuche: 0Wird geladen…

Importiere das Modul `re`. Extrahere alle aus einer oder mehreren Ziffern bestehenden Zahlen aus dem String `log_line = "Error 404 in 15ms"`. Speichere die Liste in `numbers` und evaluiere sie.

Editor wird geladen…
Hinweis anzeigen

Verwende re.findall(r'\d+', log_line), um alle Zahlen als Liste von Strings zu extrahieren.

Lösung nach 3 Versuchen verfügbar