Sammenligning af strenge ved hjælp af Python

I Python er strenge sekvenser af tegn, som effektivt gemmes i hukommelsen som et objekt. Hvert objekt kan identificeres ved hjælp af id() metode, som du kan se nedenfor. Python forsøger at genbruge objekter i hukommelsen, der har samme værdi, hvilket også gør sammenligning af objekter meget hurtig 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 at sammenligne strenge tilbyder Python et par forskellige operatører at gøre det. Først vil vi forklare dem mere detaljeret nedenfor. For det andet vil vi gennemgå begge string og re moduler, som indeholder metoder til at håndtere store og små bogstaver og upræcise matches. For det tredje, at beskæftige sig med multi-line strenge difflib modul er ret praktisk. En række eksempler vil hjælpe dig med at forstå, hvordan du bruger dem.

Sammenlign Strngs med operatørerne == og !=

Som en grundlæggende sammenligningsoperatør, du vil bruge == , !=. De fungerer på nøjagtig samme måde som med heltals- og flydende værdier. Det == operatør vender tilbage True hvis der er et nøjagtigt match, ellers False vil blive returneret. I modsætning hertil != operatør vender tilbage True hvis der ikke er match og ellers vender tilbage False. Liste 1 demonstrerer dette.

I en for løkke, sammenlignes en streng med navnet på den schweiziske by "Lausanne" med en post fra en liste over andre steder, og sammenligningsresultatet udskrives på stdout.

Fortegnelse 1:


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

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

At køre Python-scriptet ovenfra outputtet er som følger:

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

== , is Operatører

Python har de to sammenligningsoperatorer == , is. Ved første øjekast ser de ud til at være ens, men det er de faktisk ikke.

== sammenligner to variable baseret på den værdi, de repræsenterer. I modsætning hertil is operatør sammenligner to variable baseret på objekt-id'et i hukommelsen.

John (Doe) og John (Moe) kaldes begge John. Hvis vi kan reducere dem til blot deres navne, ville de have samme værdi, men stadig to forskellige personer kvalitativt.

Det næste eksempel viser det for tre variable med strengværdier. De to variable a , b har samme værdi, og Python henviser til det samme objekt for at minimere hukommelsesforbrug.

Dette gøres for simple typer og strenge 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 værdien ændres, vil Python genskabe objektet og tildele variablen. I det næste kodestykke b får værdien 2, og efterfølgende b , c referer til det samme objekt:

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

Flere sammenligningsoperatører

Til en sammenligning vedrørende en leksikografisk rækkefølge kan du bruge sammenligningsoperatorerne <, >, <=og >=. Selve sammenligningen udføres karakter for karakter. Rækkefølgen afhænger af rækkefølgen af ​​tegnene i alfabetet. Denne rækkefølge afhænger af den tegntabel, der er i brug på din maskine, mens Python-koden udføres.

Husk, at ordren skelner mellem store og små bogstaver. Som et eksempel på det latinske alfabet kommer "Bus" før "bus". Liste 2 viser, hvordan disse sammenligningsoperatører fungerer i praksis.

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

At køre Python-scriptet ovenfra outputtet er som følger:

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

Størrelsessammenligninger uden store og små bogstaver

De tidligere eksempler fokuserede på eksakte overensstemmelser mellem strenge. For at tillade sammenligninger uden store og små bogstaver tilbyder Python specielle strengmetoder som f.eks upper() , lower(). Begge er direkte tilgængelige som metoder til det tilsvarende strengobjekt.

upper() konverterer hele strengen til store bogstaver, og lower() med henholdsvis små bogstaver. Baseret på Liste 1 den næste liste viser, hvordan du bruger lower() fremgangsmåde.

Tjek vores praktiske, praktiske guide til at lære Git, med bedste praksis, brancheaccepterede standarder og inkluderet snydeark. Stop med at google Git-kommandoer og faktisk lærer det!

Fortegnelse 3:


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

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

Udgangen 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 strenge ved hjælp af regulære udtryk (RegEx)

A Regulært udtryk - eller "regex" for kort - definerer et specifikt mønster af tegn.

For at gøre brug af denne mekanisme i Python importerer du re modul først og definere et specifikt mønster, derefter. Igen er følgende eksempel baseret på Liste 1. Søgemønsteret matcher "bay" og begynder med enten et lille eller et stort bogstav. Helt præcist finder den følgende Python-kode alle de strenge, som søgemønsteret forekommer i, uanset hvilken position af strengen - i begyndelsen, eller i midten eller i slutningen.

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

Outputtet er som følger og matcher "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 af flere linjer og lister

Indtil videre har vores sammenligninger kun været på nogle få ord. Bruger difflib modul Python tilbyder også en måde at sammenligne strenge med flere linjer og hele lister med ord. Outputtet kan konfigureres i henhold til forskellige formater af diff-værktøjer.

Det næste eksempel (Liste 5) sammenligner to flerlinjede strenge linje for linje og viser sletninger såvel som tilføjelser. Efter initialiseringen af Differ objekt i linje 12 sammenligningen foretages ved hjælp af compare() metode i linje 15. Resultatet udskrives på standardoutputtet:


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

Kørsel af scriptet skaber output som vist nedenfor. Linjer med sletninger er angivet med - tegn, hvorimod linjer med tilføjelser starter med en + skilt. Ydermere starter linjer med ændringer med et spørgsmålstegn. Ændringer er angivet vha ^ tegn på den pågældende position. Linjer uden en indikator er stadig 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.

Konklusion

I denne artikel har du lært forskellige måder at sammenligne strenge i Python. Vi håber, at denne oversigt hjælper dig med at programmere effektivt i din udviklers liv.

Anerkendelser

Forfatteren vil gerne takke Mandy Neumeyer for hendes støtte under udarbejdelsen af ​​artiklen.

Tidsstempel:

Mere fra Stablemisbrug