Wie man mit regulären Ausdrücken in Python Daten und Zeiten abgleicht

In diesem Artikel wird erklärt, wie man reguläre Ausdrücke in Python verwendet, um Daten und Uhrzeiten aus Textdaten zu extrahieren. Reguläre Ausdrücke sind ein leistungsstarkes Werkzeug, mit dem man durch Musterabgleich effizient bestimmte Zeichenfolgenformate erkennen kann. Der Artikel deckt sowohl die Grundlagen als auch fortgeschrittene Techniken ab und zeigt, wie man mit konkreten Beispielen Daten und Uhrzeiten in Python genau abgleicht.

Inhaltsverzeichnis

Was sind reguläre Ausdrücke?

Reguläre Ausdrücke (Regular Expressions) sind spezielle Zeichenfolgen, die verwendet werden, um Muster in Texten zu definieren. Sie drücken Kombinationen von Zeichen oder Wiederholungen aus und werden zum Suchen, Ersetzen und Extrahieren von Zeichenfolgen genutzt. Sie finden breite Anwendung in der Programmierung und der Textverarbeitung und sind ein äußerst flexibles und effizientes Werkzeug zur Datenmanipulation.

Das reguläre Ausdruck-Modul in Python

In Python wird das Modul „re“ als Standardbibliothek für die Arbeit mit regulären Ausdrücken bereitgestellt. Mit diesem Modul können Sie einfach Zeichenfolgen durchsuchen, ersetzen, teilen und abgleichen. Nachfolgend werden die grundlegende Verwendung und die wichtigsten Funktionen vorgestellt.

Grundlegende Verwendung

Um reguläre Ausdrücke zu verwenden, müssen Sie zunächst das „re“-Modul importieren. Dann erstellen Sie ein reguläres Ausdrucksmuster und verwenden es für Textoperationen.

import re

# Kompiliere das reguläre Ausdrucksmuster
pattern = re.compile(r'\d{4}-\d{2}-\d{2}')

# Führe den Abgleich durch
match = pattern.match('2023-06-16')
if match:
    print("Abgleich erfolgreich:", match.group())

Wichtige Funktionen

  • re.match(): Überprüft, ob der Anfang einer Zeichenfolge mit dem Muster übereinstimmt.
  • re.search(): Durchsucht die gesamte Zeichenfolge und gibt den ersten Treffer zurück.
  • re.findall(): Gibt alle Übereinstimmungen als Liste zurück.
  • re.sub(): Ersetzt Übereinstimmungen mit einer neuen Zeichenfolge.

Abgleich von Daten

Das reguläre Ausdrucksmuster für den Abgleich von Daten variiert je nach Datumformat. Hier wird das gängige Format „YYYY-MM-DD“ als Beispiel verwendet. Dieses Format besteht aus dem Jahr (4 Ziffern), dem Monat (2 Ziffern) und dem Tag (2 Ziffern).

Einfacher Datenabgleich

Das folgende reguläre Ausdrucksmuster gleicht Daten im Format „YYYY-MM-DD“ ab.

import re

# Erstelle das reguläre Ausdrucksmuster
date_pattern = re.compile(r'\b\d{4}-\d{2}-\d{2}\b')

# Beispieltext
text = "Das heutige Datum ist 2023-06-16."

# Führe den Abgleich durch
matches = date_pattern.findall(text)
if matches:
    print("Gefundene Daten:", matches)
else:
    print("Kein Datum gefunden.")

Dieses Muster gleicht vier Ziffern (‚\d{4}‘), gefolgt von einem Bindestrich (‚-‚), zwei Ziffern (‚\d{2}‘), erneut einem Bindestrich und zwei Ziffern (‚\d{2}‘) ab. Das \b zeigt den Wortgrenzbereich an und stellt sicher, dass vor und nach dem Datum keine anderen Zeichen vorhanden sind.

Beispiel: Abgleich von mehreren Datumsformaten

Um mehrere Datumsformate abzugleichen, können mehrere Muster kombiniert werden. Zum Beispiel können auch „YYYY/MM/DD“ oder „YYYY.MM.DD“ berücksichtigt werden, wie im folgenden Beispiel.

# Kombinierte reguläre Ausdrücke für mehrere Formate
date_pattern = re.compile(r'\b\d{4}[-/\.]\d{2}[-/\.]\d{2}\b')

# Beispieltext
text = "Das heutige Datum ist 2023-06-16, gestern war es 2023/06/15, morgen wird es 2023.06.17 sein."

# Führe den Abgleich durch
matches = date_pattern.findall(text)
if matches:
    print("Gefundene Daten:", matches)
else:
    print("Kein Datum gefunden.")

Dieses Muster erkennt Bindestriche (‚-‚), Schrägstriche (‚/‘) und Punkte (‚.‘) als Trennzeichen.

Abgleich von Uhrzeiten

Für den Abgleich von Uhrzeiten gibt es ebenfalls unterschiedliche reguläre Ausdrücke, je nach Uhrzeitformat. Hier wird das gängige Format „HH:MM:SS“ als Beispiel verwendet. Dieses Format besteht aus der Stunde (2 Ziffern), der Minute (2 Ziffern) und der Sekunde (2 Ziffern).

Einfacher Uhrzeitabgleich

Das folgende reguläre Ausdrucksmuster gleicht Uhrzeiten im Format „HH:MM:SS“ ab.

import re

# Erstelle das reguläre Ausdrucksmuster
time_pattern = re.compile(r'\b\d{2}:\d{2}:\d{2}\b')

# Beispieltext
text = "Die aktuelle Uhrzeit ist 14:30:45."

# Führe den Abgleich durch
matches = time_pattern.findall(text)
if matches:
    print("Gefundene Uhrzeiten:", matches)
else:
    print("Keine Uhrzeit gefunden.")

Dieses Muster gleicht zwei Ziffern (‚\d{2}‘), gefolgt von einem Doppelpunkt (‚:‘), dann wieder zwei Ziffern, einem weiteren Doppelpunkt und zwei Ziffern ab. Das \b zeigt den Wortgrenzbereich an und stellt sicher, dass keine anderen Zeichen vor oder nach der Uhrzeit stehen.

Beispiel: Abgleich von 24-Stunden- und 12-Stunden-Formaten

Um sowohl 24-Stunden- als auch 12-Stunden-Formate zu erkennen, wird das Muster um die Angabe „AM/PM“ erweitert.

# 24-Stunden- und 12-Stunden-Format
time_pattern = re.compile(r'\b((1[0-2]|0?[1-9]):[0-5][0-9](\s?[APap][Mm])?|([01][0-9]|2[0-3]):[0-5][0-9])\b')

# Beispieltext
text = "Die aktuelle Uhrzeit ist 14:30, das Meeting am Morgen ist um 10:00 AM und am Nachmittag um 02:00 PM."

# Führe den Abgleich durch
matches = time_pattern.findall(text)
if matches:
    print("Gefundene Uhrzeiten:", [match[0] for match in matches])
else:
    print("Keine Uhrzeit gefunden.")

Dieses Muster erkennt Uhrzeiten im folgenden Format:

  • 24-Stunden-Format (z.B. 14:30)
  • 12-Stunden-Format (z.B. 10:00 AM, 02:00 PM)

Beispiel: Umwandlung von Datums- und Uhrzeitformaten

Dieser Abschnitt zeigt, wie man mit regulären Ausdrücken Daten und Uhrzeiten extrahiert und in ein anderes Format umwandelt. Hier wird das Format „YYYY-MM-DD HH:MM:SS“ in das Format „MM/DD/YYYY hh:mm AM/PM“ umgewandelt.

Extraktion von Daten und Uhrzeiten

Zunächst extrahieren wir Daten und Uhrzeiten aus einem Text mit regulären Ausdrücken.

import re

# Erstelle das reguläre Ausdrucksmuster
datetime_pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})')

# Beispieltext
text = "Das Event startet am 2023-06-16 14:30:45."

# Führe den Abgleich durch
match = datetime_pattern.search(text)
if match:
    year, month, day, hour, minute, second = match.groups()
    print("Extrahiertes Datum und Uhrzeit:", match.group())
else:
    print("Kein Datum und Uhrzeit gefunden.")

Implementierung der Formatumwandlung

Nun wandeln wir das extrahierte Datum und die Uhrzeit in das Format „MM/DD/YYYY hh:mm AM/PM“ um.

# Bestimme AM/PM
hour = int(hour)
if hour >= 12:
    period = "PM"
    if hour > 12:
        hour -= 12
else:
    period = "AM"
    if hour == 0:
        hour = 12

# Umwandlung in neues Format
formatted_datetime = f"{month}/{day}/{year} {hour:02}:{minute} {period}"
print("Umgewandeltes Datum und Uhrzeit:", formatted_datetime)

Dieser Code wandelt eine Uhrzeit im 24-Stunden-Format in ein 12-Stunden-Format um und fügt AM/PM hinzu, um das neue Format zu erzeugen.

Übungsaufgaben: Extraktion von Daten und Uhrzeiten

Um Ihr Verständnis für die Extraktion von Daten und Uhrzeiten mit regulären Ausdrücken zu vertiefen, lösen Sie bitte die folgenden Übungsaufgaben. Diese Aufgaben helfen Ihnen, Ihre Fähigkeiten durch praktische Anwendung zu entwickeln.

Übung 1: Extraktion eines einzelnen Datums

Erstellen Sie ein reguläres Ausdrucksmuster, um das Datum im Format „YYYY-MM-DD“ aus dem folgenden Text zu extrahieren.

text = "Die Frist ist am 2024-07-20. Der Projektbeginn war am 2024-06-01."

Beispielantwort

import re

date_pattern = re.compile(r'\b\d{4}-\d{2}-\d{2}\b')
dates = date_pattern.findall(text)
print("Extrahierte Daten:", dates)

Übung 2: Extraktion mehrerer Uhrzeiten

Erstellen Sie ein reguläres Ausdrucksmuster, um alle Uhrzeiten im Format „HH:MM:SS“ aus dem folgenden Text zu extrahieren.

text = "Frühstück ist um 07:30:00, Mittagessen um 12:00:00 und Abendessen um 19:45:00."

Beispielantwort

import re

time_pattern = re.compile(r'\b\d{2}:\d{2}:\d{2}\b')
times = time_pattern.findall(text)
print("Extrahierte Uhrzeiten:", times)

Übung 3: Extraktion von Datum und Uhrzeit und Formatumwandlung

Extrahieren Sie das Datum und die Uhrzeit im Format „YYYY-MM-DD HH:MM:SS“ aus dem folgenden Text und wandeln Sie es in das Format „MM/DD/YYYY hh:mm AM/PM“ um.

text = "Das Meeting beginnt am 2024-06-16 14:30:45."

Beispielantwort

import re

# Erstelle das reguläre Ausdrucksmuster
datetime_pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})')

# Führe den Abgleich durch
match = datetime_pattern.search(text)
if match:
    year, month, day, hour, minute, second = match.groups()

    # Bestimme AM/PM
    hour = int(hour)
    if hour >= 12:
        period = "PM"
        if hour > 12:
            hour -= 12
    else:
        period = "AM"
        if hour == 0:
            hour = 12

    # Umwandlung in neues Format
    formatted_datetime = f"{month}/{day}/{year} {hour:02}:{minute} {period}"
    print("Umgewandeltes Datum und Uhrzeit:", formatted_datetime)
else:
    print("Kein Datum und Uhrzeit gefunden.")

Häufige Fehler und deren Lösungen

Bei der Verwendung von regulären Ausdrücken kann es zu einigen häufigen Fehlern kommen. Wenn man diese Fehler versteht und korrekt darauf reagiert, kann man die Präzision und Effizienz von regulären Ausdrücken deutlich verbessern.

Fehler 1: Gieriger Abgleich führt zu übermäßigen Übereinstimmungen

Gieriger Abgleich (greedy matching) versucht, so viel wie möglich zu erfassen. Dadurch kann es vorkommen, dass unerwartete Teile der Zeichenfolge abgeglichen werden.

Lösung: Verwenden Sie nicht-gierigen Abgleich

Durch den Einsatz von nicht-gierigem Abgleich (lazy matching) können nur die minimal benötigten Teile abgeglichen werden. Verwenden Sie dafür das Fragezeichen (‚*?‘ oder ‚+?‘), um den Abgleich nicht-gierig zu machen.

import re

text = "Start123End456End"
pattern = re.compile(r'Start.*?End')

matches = pattern.findall(text)
print("Nicht-gieriger Abgleich:", matches)

Fehler 2: Falsche Verwendung von Escape-Zeichen

Wenn Sie in regulären Ausdrücken Zeichen mit einer besonderen Bedeutung wie . oder * verwenden, funktionieren sie nicht wie erwartet.

Lösung: Verwenden Sie Escape-Zeichen korrekt

Wenn Sie solche speziellen Zeichen verwenden müssen, setzen Sie ein Rückwärtsschrägstrich (\), um sie zu entkommen.

import re

text = "Der Dateiname ist example.txt."
pattern = re.compile(r'example\.txt')

matches = pattern.findall(text)
print("Ergebnis der Escape-Zeichen-Nutzung:", matches)

Fehler 3: Leistungsprobleme durch komplexe Muster

Komplexe reguläre Ausdrucksmuster können zu einer schlechteren Leistung führen und die Ausführungszeit verlängern.

Lösung: Optimieren Sie die Muster

Indem Sie reguläre Ausdrücke einfach und effizient gestalten, können Sie die Leistung verbessern. Vermeiden Sie unnötige Erfassungsgruppen und streben Sie minimalen Abgleich an.

import re

# Komplexes Muster
complex_pattern = re.compile(r'(\d{1,4})-?(\d{1,2})-?(\d{1,2})')

# Einfacheres Muster
optimized_pattern = re.compile(r'\d{1,4}-\d{1,2}-\d{1,2}')

Fehler 4: Missverständnisse bei den Abgleich-Ergebnissen

Wenn die Ergebnisse des regulären Ausdrucks nicht richtig verstanden werden, kann es zu unerwünschten Ergebnissen kommen.

Lösung: Verwenden Sie das Match-Objekt

Verwenden Sie das Match-Objekt, um exakt den übereinstimmenden Teil und die Erfassungsgruppen zu erhalten.

import re

text = "Das Datum ist 2024-07-20."
pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')

match = pattern.search(text)
if match:
    year, month, day = match.groups()
    print(f"Extrahiertes Datum: Jahr={year}, Monat={month}, Tag={day}")
else:
    print("Kein Datum gefunden.")

Zusammenfassung

Reguläre Ausdrücke sind ein leistungsstarkes Werkzeug, um bestimmte Formatzeichenfolgen wie Daten und Uhrzeiten effizient abzugleichen. Mit dem „re“-Modul in Python können Sie komplexe Textoperationen einfach ausführen. Dieser Artikel hat die grundlegende Verwendung von regulären Ausdrücken, den spezifischen Abgleich von Daten und Uhrzeiten, fortgeschrittene Beispiele, Übungen sowie häufige Fehler und deren Lösungen behandelt. Die richtige Anwendung von regulären Ausdrücken kann die Präzision und Effizienz der Datenverarbeitung erheblich steigern.

Inhaltsverzeichnis