Merkkijonojen vertailu Pythonilla

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ä vastoin is 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.

Aikaleima:

Lisää aiheesta Stackabus