Sammenligning av strenger med Python

I Python er strenger sekvenser av tegn, som effektivt lagres i minnet som et objekt. Hvert objekt kan identifiseres ved hjelp av id() metode, som du kan se nedenfor. Python prøver å gjenbruke objekter i minnet som har samme verdi, noe som også gjør sammenligning av objekter veldig rask i Python:

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

For å sammenligne strenger tilbyr Python noen få forskjellige operatører for å gjøre det. Først vil vi forklare dem mer detaljert nedenfor. For det andre skal vi gå gjennom begge string og re moduler, som inneholder metoder for å håndtere store og små bokstaver og unøyaktige treff. For det tredje, for å håndtere multi-line strenger difflib modul er ganske hendig. En rekke eksempler vil hjelpe deg å forstå hvordan du bruker dem.

Sammenlign Strngs med The == og != Operators

Som en grunnleggende sammenligningsoperatør du vil bruke == og !=. De fungerer på nøyaktig samme måte som med heltalls- og flyteverdier. De == operatøren kommer tilbake True hvis det er et eksakt samsvar, ellers False vil bli returnert. I motsetning til dette != operatøren kommer tilbake True hvis det ikke er match og ellers returnerer False. Oppføring 1 demonstrerer dette.

I en for løkke, sammenlignes en streng som inneholder navnet på den sveitsiske byen "Lausanne" med en oppføring fra en liste over andre steder, og sammenligningsresultatet skrives ut på stdout.

Oppføring 1:


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

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

Å kjøre Python-skriptet ovenfra utdataene er som følger:

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

De == og is Operatører

Python har de to sammenligningsoperatorene == og is. Ved første øyekast ser de ut til å være de samme, men faktisk er de ikke det.

== sammenligner to variabler basert på verdien de representerer. I motsetning til dette is operatør sammenligner to variabler basert på objekt-ID i minnet.

John (Doe) og John (Moe) kalles begge John. Hvis vi kan redusere dem til bare navnene deres, ville de vært like i verdi, men fortsatt to forskjellige personer kvalitativt.

Det neste eksemplet viser det for tre variabler med strengverdier. De to variablene a og b har samme verdi, og Python refererer til det samme objektet for å minimere minnebruken.

Dette gjøres for enkle typer og strenger som standard, men ikke for andre objekter:

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

Så snart verdien endres, vil Python gjenopprette objektet og tilordne variabelen. I neste kodebit b får verdien av 2, og deretter b og c referer til samme objekt:

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

Flere sammenligningsoperatører

For en sammenligning angående en leksikografisk rekkefølge kan du bruke sammenligningsoperatorene <, >, <=og >=. Selve sammenligningen gjøres karakter for karakter. Rekkefølgen avhenger av rekkefølgen på tegnene i alfabetet. Denne rekkefølgen avhenger av tegntabellen som er i bruk på maskinen din mens du kjører Python-koden.

Husk at bestillingen skiller mellom store og små bokstaver. Som et eksempel for det latinske alfabetet kommer "Buss" før "buss". Oppføring 2 viser hvordan disse sammenligningsoperatørene fungerer i praksis.

Oppføring 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}")

Å kjøre Python-skriptet ovenfra utdataene er som følger:

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

Stringsammenlikninger uten store og små bokstaver

De forrige eksemplene fokuserte på eksakte samsvar mellom strenger. For å tillate sammenligninger som ikke skiller mellom store og små bokstaver, tilbyr Python spesielle strengmetoder som f.eks upper() og lower(). Begge er direkte tilgjengelige som metoder for det tilsvarende strengobjektet.

upper() konverterer hele strengen til store bokstaver, og lower() i henholdsvis små bokstaver. Basert på Oppføring 1 den neste oppføringen viser hvordan du bruker lower() metoden.

Sjekk ut vår praktiske, praktiske guide for å lære Git, med beste praksis, bransjeaksepterte standarder og inkludert jukseark. Slutt å google Git-kommandoer og faktisk lære den!

Oppføring 3:


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

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

Resultatet er som følger:

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

Sammenlign strenger ved å bruke regulære uttrykk (RegEx)

A Regular Expression – eller “regex” for kort – definerer et spesifikt mønster av tegn.

For å gjøre bruk av denne mekanismen i Python importerer du re moduler først og definere et spesifikt mønster, deretter. Igjen er følgende eksempel basert på Oppføring 1. Søkemønsteret samsvarer med "bay", og begynner med enten en liten eller en stor bokstav. Nøyaktig, den følgende Python-koden finner alle strengene som søkemønsteret forekommer i, uansett hvilken posisjon av strengen - i begynnelsen, eller i midten eller på slutten.

Oppføring 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")

Utgangen er som følger, og samsvarer med "Bayswater", "Table Bay" og "Bombay" fra listen over steder:

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

Sammenligning av flere linjer og lister

Så langt har sammenligningene våre bare vært på noen få ord. Bruker difflib Modul Python tilbyr også en måte å sammenligne flerlinjede strenger og hele lister med ord. Utgangen kan konfigureres i henhold til forskjellige formater av diff-verktøy.

Det neste eksempelet (Oppføring 5) sammenligner to flerlinjers strenger linje for linje, og viser slettinger så vel som tillegg. Etter initialiseringen av Differ objekt i linje 12 sammenligningen gjøres ved å bruke compare() metode i linje 15. Resultatet skrives ut på standardutgangen:


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

Å kjøre skriptet oppretter utdataene som vist nedenfor. Linjer med slettinger er indikert med - tegn mens linjer med tillegg starter med a + skilt. Videre starter linjer med endringer med et spørsmålstegn. Endringer er indikert ved hjelp av ^ skilt på den aktuelle posisjonen. Linjer uten indikator er fortsatt de samme:

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

konklusjonen

I denne artikkelen har du lært ulike måter å sammenligne strenger i Python. Vi håper at denne oversikten hjelper deg med å effektivt programmere i utviklerens liv.

Takk til

Forfatteren vil gjerne takke Mandy Neumeyer for hennes støtte under utarbeidelsen av artikkelen.

Tidstempel:

Mer fra Stackabuse