Pythonissa merkkijonot ovat merkkijonoja, jotka tallennetaan tehokkaasti muistiin objektina. Jokainen kohde voidaan tunnistaa käyttämällä id()
menetelmällä, kuten alla näet. Python yrittää käyttää uudelleen muistissa olevia objekteja, joilla on sama arvo, mikä tekee myös objektien vertailusta erittäin nopeaa Pythonissa:
$ 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()
Python tarjoaa useita eri operaattoreita merkkijonojen vertailua varten. Ensin selitämme niitä tarkemmin alla. Toiseksi käymme läpi molemmat string
ja re
moduulit, jotka sisältävät menetelmiä kirjainkoolla välittömän ja epätarkan vastaavuuden käsittelemiseksi. Kolmanneksi käsitellä monirivisiä merkkijonoja difflib-moduuli on varsin kätevä. Useat esimerkit auttavat sinua ymmärtämään, kuinka niitä käytetään.
Vertaa merkkijonoja ==- ja !=-operaattoreihin
Perusvertailuoperaattorina, jota haluat käyttää ==
ja !=
. Ne toimivat täsmälleen samalla tavalla kuin kokonaisluku- ja liukuarvot. The ==
operaattori palaa True
jos on tarkka vastaavuus, muuten False
palautetaan. Sitä vastoin !=
operaattori palaa True
jos ottelua ei löydy ja muuten palaa False
. Listaus 1 XNUMX osoittaa tämän.
Jonkin sisällä for
silmukassa Sveitsin kaupungin nimen "Lausanne" sisältävää merkkijonoa verrataan muiden paikkojen luettelon merkintään, ja vertailutulos tulostetaan stdoutiin.
Listaus 1:
listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"
for place in listOfPlaces:
print (f"comparing {place} with {currentCity}: %{place == currentCity}")
Python-skriptin suorittaminen tulosteen yläpuolelta on seuraava:
$ python3 comparing-strings.py
comparing Berlin with Lausanne: False
comparing Paris with Lausanne: False
comparing Lausanne with Lausanne: True
- ==
ja is
Operaattorit
Pythonilla on kaksi vertailuoperaattoria ==
ja is
. Ensi silmäyksellä ne näyttävät olevan samat, mutta todellisuudessa ne eivät ole sitä.
==
vertaa kahta muuttujaa niiden edustaman arvon perusteella. Sitä vastoinis
operaattori vertaa kahta muuttujaa muistissa olevan objektitunnuksen perusteella.
John (Doe) ja John (Moe) ovat molemmat nimeltään John. Jos voimme pelkistää heidät vain heidän nimiinsä, ne olisivat samanarvoisia, mutta silti kaksi eri henkilöä laadullisesti.
Seuraava esimerkki osoittaa, että kolmelle muuttujalle merkkijonoarvoilla. Kaksi muuttujaa a
ja b
on sama arvo, ja Python viittaa samaan objektiin muistin käytön minimoimiseksi.
Tämä tehdään oletuksena yksinkertaisille tyypeille ja merkkijonoille, mutta ei muille objekteille:
>>> a = 'hello'
>>> b = 'hello'
>>> c = 'world'
>>> a is b
True
>>> a is c
False
>>> id(a)
140666888153840
>>> id(b)
140666888153840
>>>
Heti kun arvo muuttuu, Python luo objektin uudelleen ja määrittää muuttujan. Seuraavassa koodinpätkässä b
saa arvon 2 ja sen jälkeen b
ja c
viittaavat samaan kohteeseen:
>>> b = 'world'
>>> id(b)
140666888154416
>>> id(c)
140666888154416
Lisää vertailuoperaattoreita
Leksikografista järjestystä koskevaan vertailuun voit käyttää vertailuoperaattoreita <
, >
, <=
ja >=
. Itse vertailu tehdään hahmolta. Järjestys riippuu aakkosten merkkien järjestyksestä. Tämä järjestys riippuu merkkitaulukosta, joka on käytössä koneessasi Python-koodia suoritettaessa.
Muista, että järjestyksessä on kirjainkoolla merkitystä. Esimerkkinä latinalaisesta aakkosesta "bussi" tulee ennen "bussia". Listaus 2 XNUMX näyttää kuinka nämä vertailuoperaattorit toimivat käytännössä.
Listaus 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}")
Python-skriptin suorittaminen tulosteen yläpuolelta on seuraava:
$ python3 comparing-strings-order.py
Berlin comes before Lausanne
Paris comes after Lausanne
Lausanne is equal to Lausanne
Kirjainkoolla välittömät merkkijonovertailut
Aiemmissa esimerkeissä keskityttiin merkkijonojen välisiin tarkkoihin vastaavuuksiin. Python tarjoaa erityisiä merkkijonomenetelmiä, kuten kirjainkokoa erottelevia vertailuja upper()
ja lower()
. Molemmat ovat suoraan saatavilla kyseisen merkkijonoobjektin menetelminä.
upper()
muuntaa koko merkkijonon isoiksi kirjaimille ja lower()
pienillä kirjaimilla. Perustuen Listaus 1 XNUMX seuraava luettelo näyttää kuinka käyttää lower()
menetelmällä.
Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!
Listaus 3:
listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "lausANne"
for place in listOfPlaces:
print (f"comparing {place} with {place.lower() == currentCity.lower()}: {currentCity}")
Tuotos on seuraava:
$ python3 comparing-strings-case-insensitive.py
comparing Berlin with lausANne: False
comparing Paris with lausANne: False
comparing Lausanne with lausANne: True
Vertaa merkkijonoja säännöllisillä lausekkeilla (RegEx)
A Säännöllinen lauseke – tai lyhennettynä “regex” – määrittää tietyn merkkimallin.
Voit hyödyntää tätä mekanismia Pythonissa tuomalla re
moduuli ensin ja määrittele seuraavaksi tietty malli. Jälleen seuraava esimerkki perustuu Listaus 1 XNUMX. Hakumalli vastaa sanaa "lahti" ja alkaa joko pienellä tai isolla kirjaimella. Tarkkaan ottaen seuraava Python-koodi löytää kaikki merkkijonot, joissa hakukuvio esiintyy riippumatta siitä, missä merkkijonon kohdassa – alussa, keskellä tai lopussa.
Listaus 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")
Tulos on seuraava ja vastaa paikkaluettelosta "Bayswater", "Table Bay" ja "Bombay":
$ python3 comparing-strings-re.py
Bayswater matches the search pattern
Table Bay matches the search pattern
Bombay matches the search pattern
Multi-Line ja luettelo vertailut
Toistaiseksi vertailumme ovat olleet vain muutamissa sanoissa. Käyttämällä difflib
Python-moduuli tarjoaa myös tavan verrata monirivisiä merkkijonoja ja kokonaisia sanaluetteloita. Lähtö voidaan konfiguroida eri muotojen erotustyökalujen mukaan.
Seuraava esimerkki (Listaus 5 XNUMX) vertaa kahta monirivistä merkkijonoa rivi riviltä ja näyttää poistot ja lisäykset. Alustuksen jälkeen Differ
objekti rivillä 12 vertailu tehdään käyttämällä compare()
menetelmä rivillä 15. Tulos tulostetaan vakiotulosteeseen:
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))
Skriptin suorittaminen luo tulosteen alla näkyvällä tavalla. Poistetut rivit on merkitty -
merkkejä, kun taas lisäyksiä sisältävät rivit alkavat kirjaimella a +
merkki. Lisäksi rivit, joilla on muutoksia, alkavat kysymysmerkillä. Muutokset ilmoitetaan käyttämällä ^
merkit vastaavassa paikassa. Ilman ilmaisinta olevat rivit ovat edelleen samat:
$ 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.
Yhteenveto
Tässä artikkelissa olet oppinut erilaisia tapoja verrata merkkijonoja Pythonissa. Toivomme, että tämä yleiskatsaus auttaa sinua ohjelmoimaan tehokkaasti kehittäjäsi elämässä.
Kiitokset
Kirjoittaja haluaa kiittää Mandy Neumeyeria hänen tuestaan artikkelin valmistelussa.