Karakterláncok összehasonlítása Python használatával

A Pythonban a karakterláncok karaktersorozatok, amelyek ténylegesen objektumként tárolódnak a memóriában. Minden objektum azonosítható a id() módszerrel, amint az alább látható. A Python megpróbálja újra felhasználni az azonos értékű objektumokat a memóriában, ami az objektumok összehasonlítását is nagyon felgyorsítja a Pythonban:

$ 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()

A karakterláncok összehasonlítása érdekében a Python néhány különböző operátort kínál erre. Először az alábbiakban részletesebben ismertetjük őket. Másodszor, végigmegyünk mindkét string és a re modulok, amelyek módszereket tartalmaznak a kis- és nagybetűkre nem érzékeny és pontatlan egyezések kezelésére. Harmadszor, a többsoros karakterláncok kezelésére a difflib modul elég praktikus. Számos példa segít megérteni a használatukat.

Hasonlítsa össze a Strng-eket az == és != operátorokkal

Alapvető összehasonlító operátorként érdemes használni == és a !=. Pontosan ugyanúgy működnek, mint az integer és a float értékek esetében. A == operátor visszatér True ha van pontos egyezés, egyébként False visszaadják. Ezzel szemben a != operátor visszatér True ha nincs egyezés és egyébként visszatér False. Lista 1 ezt bizonyítja.

egy for hurok, a svájci „Lausanne” város nevét tartalmazó karakterlánc összehasonlításra kerül egy másik helyek listájából származó bejegyzéssel, és az összehasonlítás eredménye az stdout-ra kerül kinyomtatásra.

1. lista:


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

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

A Python-szkript futtatása a kimenet felett a következő:

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

A == és a is Üzemeltetők

A Python két összehasonlító operátorral rendelkezik == és a is. Első pillantásra úgy tűnik, hogy ugyanazok, de valójában nem az.

== összehasonlítja a két változót az általuk képviselt érték alapján. Ezzel szemben a is operátor két változót hasonlít össze a memóriában lévő objektumazonosító alapján.

John (Doe) és John (Moe) egyaránt Johnnak hívják. Ha csak a nevükre redukálhatjuk őket, akkor egyenlő értékűek lennének, de minőségileg mégis két különböző ember.

A következő példa azt szemlélteti, hogy három karakterláncértékű változó esetén. A két változó a és a b azonos értékkel rendelkeznek, és a Python ugyanarra az objektumra hivatkozik a memóriahasználat minimalizálása érdekében.

Ez alapértelmezés szerint egyszerű típusok és karakterláncok esetén történik, de más objektumok esetében nem:

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

Amint az érték megváltozik, a Python újra példányosítja az objektumot, és hozzárendeli a változót. A következő kódrészletben b 2 értéket kap, és ezt követően b és a c ugyanarra az objektumra hivatkoznak:

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

További összehasonlító operátorok

A lexikográfiai sorrend összehasonlításához használhatja az összehasonlító operátorokat <, >, <=és >=. Maga az összehasonlítás karakterenként történik. A sorrend az ábécé karaktereinek sorrendjétől függ. Ez a sorrend attól függ, hogy milyen karaktertáblát használ a gépen a Python-kód végrehajtásakor.

Ne feledje, hogy a sorrend megkülönbözteti a kis- és nagybetűket. A latin ábécé példájaként a „busz” a „busz” elé kerül. Lista 2 bemutatja, hogyan működnek ezek az összehasonlító operátorok a gyakorlatban.

2. lista:


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}")

A Python-szkript futtatása a kimenet felett a következő:

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

Kis- és nagybetűk közötti karakterlánc-összehasonlítások

Az előző példák a karakterláncok közötti pontos egyezésekre összpontosítottak. A kis- és nagybetűk közötti összehasonlítások lehetővé tétele érdekében a Python speciális karakterlánc-módszereket kínál, mint pl upper() és a lower(). Mindkettő közvetlenül elérhető metódusként a megfelelő karakterlánc objektumhoz.

upper() a teljes karakterláncot nagybetűkké alakítja, és lower() kisbetűkkel, ill. Alapján Lista 1 a következő lista bemutatja, hogyan kell használni a lower() módszer.

Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!

3. lista:


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

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

A kimenet a következő:

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

Karakterláncok összehasonlítása reguláris kifejezésekkel (RegEx)

A Reguláris kifejezés – vagy röviden „regex” – egy adott karaktermintát határoz meg.

Ennek a mechanizmusnak a Pythonban való használatához importálja a re modul először, és határozzon meg egy konkrét mintát, majd ezután. A következő példa ismét a Lista 1. A keresési minta megfelel a „bay” kifejezésnek, és kisbetűvel vagy nagybetűvel kezdődik. Pontosabban, a következő Python-kód megtalálja az összes karakterláncot, amelyben a keresési minta előfordul, függetlenül attól, hogy a karakterlánc melyik pozíciójában található – az elején, a közepén vagy a végén.

4. lista:


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")

A kimenet a következő, és megegyezik a „Bayswater”, „Table Bay” és „Bombay” kifejezésekkel a helyek listájából:

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

Többsoros és listás összehasonlítások

Összehasonlításaink eddig csak néhány szóra vonatkoztak. Használni a difflib A Python modul lehetőséget kínál többsoros karakterláncok és teljes szólisták összehasonlítására is. A kimenet különféle formátumú diff eszközök szerint konfigurálható.

A következő példa (Lista 5) soronként összehasonlít két többsoros karakterláncot, és megjeleníti a törléseket és a kiegészítéseket. Az inicializálás után a Differ objektum a 12. sorban az összehasonlítás a compare() módszert a 15. sorban. Az eredményt a szabványos kimenetre nyomtatjuk:


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))

A szkript futtatása létrehozza a kimenetet az alábbiak szerint. A törölt sorokat a jelzi - jelek, míg a kiegészítést tartalmazó sorok a-val kezdődnek + jel. Továbbá a változtatásokat tartalmazó sorok kérdőjellel kezdődnek. A változásokat a segítségével jelzik ^ táblák a megfelelő helyen. A jelző nélküli sorok továbbra is ugyanazok:

$ 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.

Következtetés

Ebben a cikkben különféle módokat tanult meg a karakterláncok Pythonban való összehasonlítására. Reméljük, hogy ez az áttekintés segít a hatékony programozásban a fejlesztő életében.

Köszönetnyilvánítás

A szerző szeretné megköszönni Mandy Neumeyernek a cikk elkészítése során nyújtott támogatását.

Időbélyeg:

Még több Stackabus