Vergleichen von Strings mit Python

In Python sind Zeichenfolgen Zeichenfolgen, die effektiv als Objekt im Speicher gespeichert werden. Jedes Objekt kann anhand der identifiziert werden id() Methode, wie Sie unten sehen können. Python versucht, Objekte im Speicher wiederzuverwenden, die denselben Wert haben, was den Vergleich von Objekten in Python auch sehr schnell macht:

$ python
Python 3.9.0 (v3.9.0:9cf6752276, Oct  5 2020, 11:29:23) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "abc"
>>> b = "abc"
>>> c = "def"
>>> print (id(a), id(b), id(c))
(139949123041320, 139949123041320, 139949122390576)
>>> quit()

Um Strings zu vergleichen, bietet Python verschiedene Operatoren an. Zunächst werden wir sie im Folgenden näher erläutern. Zweitens gehen wir beide durch string und für re Module, die Methoden zum Behandeln von Groß- und Kleinschreibung und ungenauen Übereinstimmungen enthalten. Drittens, um mit mehrzeiligen Zeichenfolgen umzugehen difflib-Modul ist ziemlich praktisch. Eine Reihe von Beispielen wird Ihnen helfen, die Verwendung zu verstehen.

Vergleichen Sie Strngs mit den Operatoren == und !=

Als einfachen Vergleichsoperator möchten Sie verwenden == und !=. Sie funktionieren genauso wie mit Integer- und Float-Werten. Der == Operator kehrt zurück True wenn es eine genaue Übereinstimmung gibt, andernfalls False Wird zurückgegeben. Im Gegensatz dazu ist die != Operator kehrt zurück True wenn es keine Übereinstimmung gibt, andernfalls wird zurückgegeben False. Listing 1: demonstriert dies.

In einer for In der Schleife wird ein String mit dem Namen der Schweizer Stadt „Lausanne“ mit einem Eintrag aus einer Liste anderer Orte verglichen und das Vergleichsergebnis auf stdout ausgegeben.

Auflistung 1:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    print (f"comparing {place} with {currentCity}: %{place == currentCity}")

Wenn Sie das Python-Skript von oben ausführen, sieht die Ausgabe wie folgt aus:

$ python3 comparing-strings.py
comparing Berlin with Lausanne: False
comparing Paris with Lausanne: False
comparing Lausanne with Lausanne: True

Das == und is Betreiber

Python verfügt über die beiden Vergleichsoperatoren == und is. Auf den ersten Blick scheinen sie gleich zu sein, aber in Wirklichkeit sind sie es nicht.

== vergleicht zwei Variablen basierend auf dem Wert, den sie darstellen. Im Gegensatz dazu ist die is Der Operator vergleicht zwei Variablen basierend auf der Objekt-ID im Speicher.

John (Doe) und John (Moe) heißen beide John. Wenn wir sie auf nur ihre Namen reduzieren könnten, wären sie zwar gleichwertig, aber qualitativ immer noch zwei verschiedene Menschen.

Das nächste Beispiel demonstriert dies für drei Variablen mit Zeichenfolgewerten. Die beiden Variablen a und b haben denselben Wert und Python verweist auf dasselbe Objekt, um die Speichernutzung zu minimieren.

Dies geschieht standardmäßig für einfache Typen und Zeichenfolgen, jedoch nicht für andere Objekte:

>>> a = 'hello'
>>> b = 'hello'
>>> c = 'world'
>>> a is b
True
>>> a is c
False
>>> id(a)
140666888153840
>>> id(b)
140666888153840
>>> 

Sobald sich der Wert ändert, instanziiert Python das Objekt erneut und weist die Variable zu. Im nächsten Codeausschnitt b erhält den Wert 2 und anschließend b und c beziehen sich auf dasselbe Objekt:

>>> b = 'world'
>>> id(b)
140666888154416
>>> id(c)
140666888154416

Weitere Vergleichsoperatoren

Für einen Vergleich hinsichtlich einer lexikographischen Reihenfolge können Sie die Vergleichsoperatoren verwenden <, >, <= und >=. Der Vergleich selbst erfolgt zeichenweise. Die Reihenfolge hängt von der Reihenfolge der Zeichen im Alphabet ab. Diese Reihenfolge hängt von der Zeichentabelle ab, die auf Ihrem Computer beim Ausführen des Python-Codes verwendet wird.

Beachten Sie, dass bei der Reihenfolge die Groß-/Kleinschreibung beachtet wird. Als Beispiel für das lateinische Alphabet steht „Bus“ vor „bus“. Listing 2: zeigt, wie diese Vergleichsoperatoren in der Praxis funktionieren.

Auflistung 2:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    if place < currentCity:
            print (f"{place} comes before {currentCity}")
    elif place > currentCity:
            print (f"{place} comes after {currentCity}")
    else:
            print (f"{place} is equal to {currentCity}")

Wenn Sie das Python-Skript von oben ausführen, sieht die Ausgabe wie folgt aus:

$ python3 comparing-strings-order.py
Berlin comes before Lausanne
Paris comes after Lausanne
Lausanne is equal to Lausanne

String-Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung

Die vorherigen Beispiele konzentrierten sich auf exakte Übereinstimmungen zwischen Zeichenfolgen. Um Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung zu ermöglichen, bietet Python spezielle String-Methoden wie z upper() und lower(). Beide sind direkt als Methoden des entsprechenden String-Objekts verfügbar.

upper() wandelt die gesamte Zeichenfolge in Großbuchstaben um und lower() jeweils in Kleinbuchstaben umwandeln. Bezogen auf Listing 1: Die nächste Auflistung zeigt, wie man das verwendet lower() Methode.

Sehen Sie sich unseren praxisnahen, praktischen Leitfaden zum Erlernen von Git an, mit Best Practices, branchenweit akzeptierten Standards und einem mitgelieferten Spickzettel. Hören Sie auf, Git-Befehle zu googeln und tatsächlich in Verbindung, um es!

Auflistung 3:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "lausANne"

for place in listOfPlaces:
    print (f"comparing {place} with {place.lower() == currentCity.lower()}: {currentCity}")

Die Ausgabe ist wie folgt:

$ python3 comparing-strings-case-insensitive.py
comparing Berlin with lausANne: False
comparing Paris with lausANne: False
comparing Lausanne with lausANne: True

Vergleichen Sie Zeichenfolgen mit regulären Ausdrücken (RegEx)

A Regulärer Ausdruck – oder kurz „Regex“ – definiert ein bestimmtes Zeichenmuster.

Um diesen Mechanismus in Python zu nutzen, importieren Sie die re Modulen zuerst und definieren Sie dann ein bestimmtes Muster. Auch hier basiert das folgende Beispiel auf Listing 1:. Das Suchmuster entspricht „bay“ und beginnt entweder mit einem Klein- oder einem Großbuchstaben. Konkret findet der folgende Python-Code alle Strings, in denen das Suchmuster vorkommt, egal an welcher Position des Strings – am Anfang, in der Mitte oder am Ende.

Auflistung 4:


import re


listOfPlaces = ["Bayswater", "Table Bay", "Bejing", "Bombay"]


pattern = re.compile("[Bb]ay")

for place in listOfPlaces:
    if pattern.search(place):
        print (f"{place} matches the search pattern")

Die Ausgabe sieht wie folgt aus und entspricht „Bayswater“, „Table Bay“ und „Bombay“ aus der Liste der Orte:

$ python3 comparing-strings-re.py
Bayswater matches the search pattern
Table Bay matches the search pattern
Bombay matches the search pattern

Mehrzeilen- und Listenvergleiche

Bisher haben sich unsere Vergleiche nur auf wenige Wörter beschränkt. Verwendung der difflib Modul Python bietet auch eine Möglichkeit, mehrzeilige Zeichenfolgen und ganze Wortlisten zu vergleichen. Die Ausgabe kann entsprechend verschiedener Formate von Diff-Tools konfiguriert werden.

Das nächste Beispiel (Listing 5:) vergleicht zwei mehrzeilige Zeichenfolgen Zeile für Zeile und zeigt Löschungen und Ergänzungen an. Nach der Initialisierung des Differ Objekt in Zeile 12 wird der Vergleich mit dem durchgeführt compare() Methode in Zeile 15. Das Ergebnis wird auf der Standardausgabe ausgegeben:


import difflib
 


original = ["About the IIS", "", "IIS 8.5 has several improvements related", "to performance in large-scale scenarios, such", "as those used by commercial hosting providers and Microsoft's", "own cloud offerings."]


edited = ["About the IIS", "", "It has several improvements related", "to performance in large-scale scenarios."]


d = difflib.Differ()
 

diff = d.compare(original, edited)
 

print ('n'.join(diff))

Durch Ausführen des Skripts wird die Ausgabe wie unten dargestellt erstellt. Zeilen mit Löschungen sind durch gekennzeichnet - Zeichen, während Zeilen mit Zusätzen mit a beginnen + Zeichen. Darüber hinaus beginnen Zeilen mit Änderungen mit einem Fragezeichen. Änderungen werden mit angezeigt ^ Schilder an der entsprechenden Stelle. Linien ohne Indikator sind immer noch dieselben:

$ python comparing-strings-difflib.py
  About the IIS
  
- IIS 8.5 has several improvements related
?  ^^^^^^

+ It has several improvements related
?  ^

- to performance in large-scale scenarios, such
?                                        ^^^^^^

+ to performance in large-scale scenarios.
?                                        ^

- as those used by commercial hosting providers and Microsoft's
- own cloud offerings.

Zusammenfassung

In diesem Artikel haben Sie verschiedene Möglichkeiten zum Vergleichen von Zeichenfolgen in Python kennengelernt. Wir hoffen, dass dieser Überblick Ihnen hilft, im Leben Ihres Entwicklers effektiv zu programmieren.

Danksagung

Die Autorin dankt Mandy Neumeyer für ihre Unterstützung bei der Erstellung des Artikels.

Zeitstempel:

Mehr von Stapelmissbrauch