Wie man Zeichenketten basierend auf mehreren Begrenzern in Python aufteilt

Dasun Nirmitha 5 November 2020
  1. Python Split-String mit zwei Trennzeichen
  2. Python-Zeichenkette mit mehreren Trennzeichen
Wie man Zeichenketten basierend auf mehreren Begrenzern in Python aufteilt

Die Python-Methode für Zeichenketten split() ermöglicht es, eine Zeichenkette auf einfache Weise in eine Liste aufzuspalten, die auf einem Begrenzer basiert. In einigen Fällen kann es jedoch erforderlich sein, dass die Trennung nicht nur auf einem, sondern auf mehreren Begrenzerwerten basiert. Dieser kurze 101 Artikel stellt zwei bequeme Ansätze vor, die dies in Python erreicht werden kann.

Python Split-String mit zwei Trennzeichen

Nehmen Sie die folgende Zeichenkette an.

text = "python is, an easy;language; to, learn."

Für unser Beispiel müssen wir sie entweder durch ein Semikolon, gefolgt von einem Leerzeichen ; , oder durch ein Komma, gefolgt von einem Leerzeichen , , trennen. In diesem Fall sollten alle Vorkommen von einzelnen Semikolons oder Kommas, d.h. , , ; ohne abschließende Leerzeichen, nicht betroffen sein.

Reguläre Ausdrücke

Obwohl die Verwendung regulärer Ausdrücke wegen ihrer recht kostspieligen Natur bei der Zeichenkettenanalyse oft verpönt ist, kann sie in einer Situation wie dieser sicher gerechtfertigt sein.

Verwendung von einfachen Ausdrücken

Das in Python eingebaute Modul re hat eine split() Methode, die wir für diesen Fall verwenden können.

Lassen Sie uns einen einfachen regulären a- oder b-Ausdruck (a|b) zur Trennung unserer mehrfachen Begrenzer verwenden.

import re

text = "python is, an easy;language; to, learn."
print(re.split("; |, ", text))

Ausgabe:

['python is', 'an easy;language', 'to', 'learn.']

Wie auf der Wikipedia-Seite erwähnt, verwenden Reguläre Ausdrücke IEEE POSIX als Standard für ihre Syntax. Indem wir uns auf diesen Standard beziehen, können wir mehrere zusätzliche Möglichkeiten verwalten, wie wir einen regulären Ausdruck schreiben können, der unserem Anwendungsfall entspricht.

Anstatt Balkentrenner (|) für die Definition unserer Begrenzer zu verwenden, können wir das gleiche Ergebnis mit der Range ([])-Syntax erreichen, die in Regulären Ausdrücken zur Verfügung steht. Sie können einen Bereich von Zeichen definieren, auf die ein regulärer Ausdruck passen kann, indem Sie sie in eckigen Klammern angeben.

Daher können wir bei der Angabe des Musters unseres regulären Ausdrucks einfach ein Semikolon und ein Komma in eckigen Klammern und ein zusätzliches Leerzeichen [;,] angeben, was dazu führen würde, dass dem regulären Ausdruck Teile einer Zeichenkette mit genau [einem Semikolon ODER Komma] und einem abschließenden Leerzeichen entsprechen.

import re

text = "python is, an easy;language; to, learn."
print(re.split("[;,] ", text))

Es zu einer Funktion machen

Der zuvor erwähnte Grundausdruck war auf einen hartkodierten Satz von Trennzeichen beschränkt. Dies kann später bei Änderungen an den Trennzeichen zu Problemen führen und schränkt auch die Wiederverwendbarkeit auf andere Teile des Codes ein. Daher ist es im Hinblick auf die Anwendung der besten Praktiken besser, eine generischere und wiederverwendbare Gestaltung des Codes in Betracht zu ziehen. Lassen Sie uns daher diese Logik sicherheitshalber in einer Python-Funktion programmieren.

import re

text = "python is, an easy;language; to, learn."
separators = "; ", ", "


def custom_split(sepr_list, str_to_split):
    # create regular expression dynamically
    regular_exp = "|".join(map(re.escape, sepr_list))
    return re.split(regular_exp, str_to_split)


print(custom_split(separators, text))

String-Funktionen verwenden

Falls Sie auf die Verwendung von Regulären Ausdrücken verzichten wollen oder keine neuen Module in das Projekt einführen müssen, nur um eine Zeichenkette zu splitten, können Sie die Methoden replace() und split(), die im Zeichenkettenmodul selbst vorhanden sind, in einer Art Hacking-Verfahren verwenden, um das gleiche Ergebnis zu erzielen.

text = "python is, an easy;language; to, learn."

# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = text.replace("; ", ", ")

print(text_one_delimiter.split(", "))

Hier ersetzen wir zunächst alle Vorkommen eines Semikolons gefolgt von einem Leerzeichen (; ) innerhalb der Zeichenkette durch unser anderes Trennzeichen, das ein Komma gefolgt von einem Leerzeichen (, ) ist. Auf diese Weise können wir die Zeichenkettenaufspaltung auf nur ein Trennzeichen beschränken, das in diesem Fall ein Komma gefolgt von einem Leerzeichen (, ) ist.

Jetzt können wir diese modifizierte Zeichenkette sicher aufteilen, indem wir die einfache Funktion split() verwenden, die im Python-Zeichenkettenmodul eingebaut ist, um dasselbe Ergebnis zu erzielen.

Beachten Sie, dass wir diesmal keine neuen Module in den Code importiert haben, um das Ergebnis zu erzielen.

Python-Zeichenkette mit mehreren Trennzeichen

Betrachten Sie den unten erwähnten Text.

text = "python is# an% easy;language- to, learn."

Für dieses Beispiel müssen wir ihn auf alle Instanzen aufteilen, in denen der Text eines der Zeichen # % ; - , gefolgt von einem Leerzeichen enthält.

Reguläre Ausdrücke

In diesem Fall können wir die zusätzlichen Trennzeichen bei der Definition unseres regulären Ausdrucks leicht hinzufügen.

import re

text = "python is# an% easy;language- to, learn."
print(re.split("; |, |# |% |- ", text))

Ausgabe:

['python is', 'an', 'easy;language', 'to', 'learn.']

als Funktion

Auch in dieser Situation können wir einfach denselben Code verwenden, den wir zuvor mit zwei Trennzeichen verwendet haben, mit einer einfachen Änderung, indem wir alle zusätzlichen Trennzeichen in die Variable separators einfügen.

import re

text = "python is# an% easy;language- to, learn."
separators = "; ", ", ", "# ", "% ", "- "


def custom_split(sepr_list, str_to_split):
    # create regular expression dynamically
    regular_exp = "|".join(map(re.escape, sepr_list))
    return re.split(regular_exp, str_to_split)


print(custom_split(separators, text))

String-Funktionen verwenden

Ähnlich wie wir es zuvor mit zwei Trennzeichen behandelt haben, können wir auch hier die Funktionen replace() und split() verwenden.

text = "python is, an easy;language; to, learn."

# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = (
    text.replace("# ", ", ").replace("% ", ", ").replace("; ", ", ").replace("- ", ", ")
)

print(text_one_delimiter.split(", "))

Ausgabe:

['python is', 'an easy;language', 'to', 'learn.']

Es ist zu beachten, dass diese Methode nicht empfohlen wird, wenn sie für höhere Begrenzerzahlen wie in diesem Fall verwendet wird. Da in diesem Fall die Methode replace() mehrfach verwendet werden muss, um mehrere Durchläufe auf der Zeichenkette zu machen, würde sie letztlich unerwünschte Leistungsspitzen verursachen, die mit Hilfe von Regulären Ausdrücken leicht zu vermeiden sind.

Verwandter Artikel - Python String