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.
Dieser Artikel wurde auf Deutsch verfasst und redaktionell überprüft. Weitere Sprachen stehen als automatische Übersetzung zur Verfügung. Wir freuen uns über Feedback am Ende des Artikels.
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 Personage
: für das Alter der Personcity
: 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:
- Flexibilität: Reguläre Ausdrücke bieten eine hohe Flexibilität bei der Textanalyse und können komplexe Muster erkennen.
- Kompakt: Reguläre Ausdrücke sind oft kürzer und prägnanter als herkömmliche Methoden.
- Benannte Gruppen: Mit benannten Gruppen können wir Teile des Musters leicht identifizieren und extrahieren.
Nachteile:
- Lernkurve: Reguläre Ausdrücke haben eine steilere Lernkurve und sind oft schwerer zu lesen und zu verstehen als herkömmliche Methoden.
- 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:
- Einfachheit: Herkömmliche Methoden sind einfach zu verstehen und zu implementieren.
- Lesbarkeit: Der Code ist leichter lesbar und verständlich für Entwickler, die mit Python vertraut sind.
Nachteile:
- Begrenzte Flexibilität: Diese Methoden bieten weniger Flexibilität bei der Analyse komplexer Textmuster.
- 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:
- Importieren wir die erforderlichen Klassen und Funktionen aus dem Konfuzio SDK.
- Erstellen wir ein
Project
-Objekt, indem wir die Projekt-ID angeben. - Erhalten wir ein
Category
-Objekt, indem wir die Kategorie-ID angeben. - Erstellen wir einen leeren
ListTokenizer
. - Erhalten wir das
Label
-Objekt für das Label „ContractDate
„. - Suchen wir nach Regex-Ausdrücken, die mit Vorkommen des Labels „
ContractDate
“ in der Trainingsdatenkategorie übereinstimmen. - Fügen wir jeden gefundenen Regex-Ausdruck als
RegexTokenizer
demListTokenizer
hinzu. - 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.