Python String Parsing für Anfänger und Experten

Python bietet eine Vielzahl von Möglichkeiten, um mit Zeichenketten (Strings) zu arbeiten. In diesem Blogbeitrag werden wir zuerst die Grundlagen des String-Parsing in Python vorstellen und den Unterschied zwischen String-Indizierung und String-Sequenz verdeutlichen.

String-Indizierung

In Python ist ein String eine Sequenz von Zeichen. Diese Zeichen können über einen Index zugegriffen werden, der bei 0 beginnt. So können Sie auf das erste, zweite und dritte Zeichen einer Zeichenkette zugreifen:

text = "Python"
print(text[0])  # Gibt 'P' aus
print(text[1])  # Gibt 'y' aus
print(text[2])  # Gibt 't' aus

Sie können auch negative Indizes verwenden, um vom Ende der Zeichenkette aus auf Zeichen zuzugreifen:

print(text[-1])  # Gibt 'n' aus
print(text[-2])  # Gibt 'o' aus
print(text[-3])  # Gibt 'h' aus

String-Sequenz

Eine String-Sequenz ist ein Teil einer Zeichenkette, der durch einen Anfangs- und Endindex angegeben wird. In Python können Sie die sogenannte Slicing-Syntax verwenden, um auf Teile einer Zeichenkette zuzugreifen:

pythonCopy codetext = "Python"
print(text[0:3])  # Gibt 'Pyt' aus
print(text[1:4])  # Gibt 'yth' aus
print(text[:2])   # Gibt 'Py' aus (ohne Anfangsindex entspricht es Index 0)
print(text[3:])   # Gibt 'hon' aus (ohne Endindex entspricht es Index + 1)

Die Slicing-Syntax funktioniert auch mit negativen Indizes:

print(text[-3:-1])  # Gibt 'ho' aus
print(text[:-2])    # Gibt 'Pyth' aus

Um die Unterschiede zwischen String-Indizierung und String-Sequenz zusammenzufassen: Die String-Indizierung bezieht sich auf den Zugriff auf ein einzelnes Zeichen in einer Zeichenkette, während die String-Sequenz den Zugriff auf einen Teil der Zeichenkette ermöglicht.

Ein Anwendungsfall für die Split-Methode in Python: Versionsnummern und Commit-Hashes

In vielen Situationen, wie beispielsweise bei der Arbeit mit Softwareprojekten, müssen wir häufig Informationen aus kombinierten Zeichenketten extrahieren. Nehmen wir als Beispiel eine Zeichenkette, die eine Versionsnummer und einen Commit-Hash enthält: „2.7.0_bf4fda703454“. Um diese Informationen zu trennen, können wir die split()-Methode in Python verwenden.

version_hash = "2.7.0_bf4fda703454"
version_hash_list = version_hash.split("_")

Das Ergebnis ist eine Liste von Strings, die wie folgt aussieht:

['2.7.0', 'bf4fda703454']

Hier wird die Zeichenkette an jedem Unterstrich getrennt. Wenn Sie möchten, dass die Trennung nur nach dem ersten Unterstrich erfolgt, können Sie die Methode split() mit dem optionalen Parameter 1 verwenden:

version_hash.split("_", 1)

Wenn Sie sicher sind, dass die Zeichenkette einen Unterstrich enthält, können Sie sogar den linken und rechten Teil in separate Variablen auspacken:

lhs, rhs = version_hash.split("_", 1)
print(lhs)  # Gibt '2.7.0' aus
print(rhs)  # Gibt 'bf4fda703454' aus

Eine Alternative zur split()-Methode ist die Verwendung von partition(). Die Verwendung ist ähnlich wie im letzten Beispiel, nur dass hier drei Komponenten anstelle von zwei zurückgegeben werden. Der Hauptvorteil dieser Methode besteht darin, dass sie nicht fehlschlägt, wenn die Zeichenkette den Trenner nicht enthält.

Im Allgemeinen ist die split()-Methode eine praktische Möglichkeit, um kombinierte Informationen in Python aufzuteilen und weiterzuverarbeiten. In unserem Beispiel konnten wir so auf einfache Weise die Versionsnummer und den Commit-Hash voneinander trennen.

String-Parsing mit regulären Ausdrücken – Regex

Text mit benannten Regex-Gruppen in Python zerlegen und Vor- und Nachteile gegenüber herkömmlichen Funktionen wie Python-String-Indexierung, Sequenzierung oder Split-Methode abwägen

Wenn wir komplexe Zeichenketten haben, die aufgrund von Mustern oder schwieriger Zeichensetzung zerlegt werden müssen, können reguläre Ausdrücke helfen, diese Muster zu erkennen und zu zerlegen.

Hier ist ein Code-Beispiel für das String-Parsing mit benannten Regex-Gruppen in Python:

import re
# Beispieltext
text = "Max Mustermann, Alter: 30 Jahre, Stadt: Berlin"
# Regulärer Ausdruck mit benannten Gruppen
pattern_text = r'(?P<name>[A-Za-zäöüÄÖÜß\s]+),\s+Alter:\s+(?P<age>\d+)\s+Jahre,\s+Stadt:\s+(?P<city>[A-Za-zäöüÄÖÜß\s]+)'
# Kompilieren des regulären Ausdrucks
pattern = re.compile(pattern_text)
# Suche nach Übereinstimmungen im Text
match = pattern.match(text)
# Überprüfen, ob eine Übereinstimmung gefunden wurde
if match:
    # Extrahieren der benannten Gruppen
    name = match.group('name')
    age = match.group('age')
    city = match.group('city')
    # Ausgabe der extrahierten Informationen
    print(f"Name: {name}")
    print(f"Alter: {age}")
    print(f"Stadt: {city}")
else:
    print("Keine Übereinstimmung gefunden.")

In diesem Beispiel haben wir einen Beispieltext mit dem Namen einer Person, dem Alter und der Stadt. Wir verwenden einen regulären Ausdruck mit benannten Gruppen, um die relevanten Informationen aus dem Text zu extrahieren. Die Gruppen sind wie folgt benannt:

  • name: für den Namen der Person
  • age: für das Alter der Person
  • city: für die Stadt, in der die Person lebt

Nachdem der reguläre Ausdruck kompiliert wurde, suchen wir nach Übereinstimmungen im Text. Wenn eine Übereinstimmung gefunden wird, extrahieren wir die benannten Gruppen und geben die extrahierten Informationen aus.

Vorteile:

  1. Flexibilität: Reguläre Ausdrücke bieten eine hohe Flexibilität bei der Textanalyse und können komplexe Muster erkennen.
  2. Kompakt: Reguläre Ausdrücke sind oft kürzer und prägnanter als herkömmliche Methoden.
  3. Benannte Gruppen: Mit benannten Gruppen können wir Teile des Musters leicht identifizieren und extrahieren.

Nachteile:

  1. Lernkurve: Reguläre Ausdrücke haben eine steilere Lernkurve und sind oft schwerer zu lesen und zu verstehen als herkömmliche Methoden.
  2. Begrenzte Anwendbarkeit: Reguläre Ausdrücke eignen sich nicht für tief verschachtelte Dokumente wie HTML, XML oder JSON.

Python-String-Indexierung, Sequenzierung oder Split-Methode: Herkömmliche Funktionen wie Python-String-Indexierung, Sequenzierung oder Split-Methode eignen sich gut für einfache Textanalyseaufgaben, bei denen die Struktur der Zeichenkette klar und einfach ist.

Vorteile:

  1. Einfachheit: Herkömmliche Methoden sind einfach zu verstehen und zu implementieren.
  2. Lesbarkeit: Der Code ist leichter lesbar und verständlich für Entwickler, die mit Python vertraut sind.

Nachteile:

  1. Begrenzte Flexibilität: Diese Methoden bieten weniger Flexibilität bei der Analyse komplexer Textmuster.
  2. Längerer Code: Der Code kann länger und unübersichtlicher werden, wenn man versucht, komplexe Muster zu erkennen und zu zerlegen.

Python Regex automatisieren

In diesem Beispiel wird gezeigt, wie das Konfuzio SDK verwendet wird, um die Erstellung von Regex automatisieren. Wir nutzen das SDK, um einen benutzerdefinierten Regex Tokenizer für das Label „ContractDate“ zu erstellen. Weitere Informationen sind in der technischen Dokumentation und in einem weiteren Blog Artikel zu finden.

from konfuzio_sdk.data import Project
from konfuzio_sdk.tokenizer.regex import RegexTokenizer
from konfuzio_sdk.tokenizer.base import ListTokenizer
# Ersetzen Sie YOUR_PROJECT_ID und YOUR_CATEGORY_ID durch die entsprechenden IDs Ihres Projekts und Ihrer Kategorie.
my_project = Project(id_=YOUR_PROJECT_ID)
category = my_project.get_category_by_id(id_=YOUR_CATEGORY_ID)
tokenizer = ListTokenizer(tokenizers=[])
label = my_project.get_label_by_name("ContractDate")
# Finden von Regex-Ausdrücken, die mit Vorkommen des Labels "ContractDate" übereinstimmen
for regex in label.find_regex(category=category):
    regex_tokenizer = RegexTokenizer(regex=regex)
    tokenizer.tokenizers.append(regex_tokenizer)
# Verwenden des erstellten Regex Tokenizers, um Annotationen für jeden übereinstimmenden String in einem Dokument zu erstellen
# Ersetzen Sie YOUR_DOCUMENT_ID durch die entsprechende ID Ihres Dokuments.
document = my_project.get_document_by_id(YOUR_DOCUMENT_ID)
tokenizer.tokenize(document)

In diesem Code-Ausschnitt:

  1. Importieren wir die erforderlichen Klassen und Funktionen aus dem Konfuzio SDK.
  2. Erstellen wir ein Project-Objekt, indem wir die Projekt-ID angeben.
  3. Erhalten wir ein Category-Objekt, indem wir die Kategorie-ID angeben.
  4. Erstellen wir einen leeren ListTokenizer.
  5. Erhalten wir das Label-Objekt für das Label „ContractDate„.
  6. Suchen wir nach Regex-Ausdrücken, die mit Vorkommen des Labels „ContractDate“ in der Trainingsdatenkategorie übereinstimmen.
  7. Fügen wir jeden gefundenen Regex-Ausdruck als RegexTokenizer dem ListTokenizer hinzu.
  8. Verwenden wir den erstellten Regex Tokenizer, um Annotationen für jeden übereinstimmenden String in einem Dokument zu erstellen. Dazu geben wir die Dokument-ID an und rufen die tokenize()-Methode des Tokenizers auf.

Nachdem der Tokenizer erstellt wurde, können Sie ihn verwenden, um automatisch Regex-Ausdrücke für das Label „ContractDate“ in Ihren Dokumenten zu finden und Annotationen dafür zu erstellen.

«
»
Avatar von Florian Zyprian

Neueste Artikel