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