Σύγκριση συμβολοσειρών με χρήση Python

Στην Python, οι συμβολοσειρές είναι ακολουθίες χαρακτήρων, οι οποίες αποθηκεύονται αποτελεσματικά στη μνήμη ως αντικείμενο. Κάθε αντικείμενο μπορεί να αναγνωριστεί χρησιμοποιώντας το id() μέθοδο, όπως μπορείτε να δείτε παρακάτω. Η Python προσπαθεί να επαναχρησιμοποιήσει αντικείμενα στη μνήμη που έχουν την ίδια τιμή, γεγονός που κάνει επίσης τη σύγκριση αντικειμένων πολύ γρήγορη στην 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()

Προκειμένου να συγκριθούν συμβολοσειρές, η Python προσφέρει μερικούς διαφορετικούς τελεστές για να το κάνουν. Αρχικά, θα τα εξηγήσουμε πιο αναλυτικά παρακάτω. Δεύτερον, θα εξετάσουμε και τα δύο string και την re ενότητες, οι οποίες περιέχουν μεθόδους χειρισμού αντιστοιχίσεων χωρίς διάκριση πεζών-κεφαλαίων και ανακριβών αντιστοιχιών. Τρίτον, για την αντιμετώπιση των χορδών πολλών γραμμών το μονάδα difflib είναι αρκετά βολικό. Ορισμένα παραδείγματα θα σας βοηθήσουν να κατανοήσετε πώς να τα χρησιμοποιήσετε.

Συγκρίνετε Strngs με τους τελεστές The == και !=

Ως βασικός τελεστής σύγκρισης που θα θέλετε να χρησιμοποιήσετε == και !=. Λειτουργούν με τον ίδιο ακριβώς τρόπο όπως με τις ακέραιες και τις τιμές float. ο == επιστρέφει ο χειριστής True αν υπάρχει ακριβής αντιστοίχιση, αλλιώς False θα επιστραφεί. Αντίθετα, το != επιστρέφει ο χειριστής True αν δεν υπάρχει αντιστοιχία και διαφορετικά επιστρέφει False. Λίστα 1 αποδεικνύει αυτό.

Σε for βρόχο, μια συμβολοσειρά που περιέχει το όνομα της ελβετικής πόλης «Λωζάνη» συγκρίνεται με μια καταχώριση από μια λίστα με άλλα μέρη και το αποτέλεσμα σύγκρισης εκτυπώνεται στο stdout.

Λίστα 1:


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

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

Η εκτέλεση του σεναρίου Python από πάνω από την έξοδο έχει ως εξής:

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

Η == και is Οι φορείς εκμετάλλευσης

Η Python έχει τους δύο τελεστές σύγκρισης == και is. Εκ πρώτης όψεως φαίνονται να είναι το ίδιο, αλλά στην πραγματικότητα δεν είναι.

== συγκρίνει δύο μεταβλητές με βάση την τιμή που αντιπροσωπεύουν. Αντίθετα, το is Ο χειριστής συγκρίνει δύο μεταβλητές με βάση το αναγνωριστικό αντικειμένου στη μνήμη.

Ο John (Doe) και ο John (Moe) ονομάζονται και οι δύο John. Αν μπορούσαμε να τα περιορίσουμε στα ονόματά τους, θα ήταν ίσα σε αξία, αλλά θα εξακολουθούσαν να είναι δύο διαφορετικά άτομα ποιοτικά.

Το επόμενο παράδειγμα δείχνει ότι για τρεις μεταβλητές με τιμές συμβολοσειράς. Οι δύο μεταβλητές a και b έχουν την ίδια τιμή και η Python αναφέρεται στο ίδιο αντικείμενο προκειμένου να ελαχιστοποιηθεί η χρήση της μνήμης.

Αυτό γίνεται για απλούς τύπους και συμβολοσειρές από προεπιλογή, αλλά όχι για άλλα αντικείμενα:

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

Μόλις αλλάξει η τιμή, η Python θα επαναφέρει το αντικείμενο και θα εκχωρήσει τη μεταβλητή. Στο επόμενο απόσπασμα κώδικα b παίρνει την τιμή του 2, και στη συνέχεια b και c αναφέρονται στο ίδιο αντικείμενο:

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

Περισσότεροι χειριστές σύγκρισης

Για σύγκριση σχετικά με μια λεξικογραφική σειρά, μπορείτε να χρησιμοποιήσετε τους τελεστές σύγκρισης <, >, <=, να >=. Η ίδια η σύγκριση γίνεται χαρακτήρα προς χαρακτήρα. Η σειρά εξαρτάται από τη σειρά των χαρακτήρων στο αλφάβητο. Αυτή η σειρά εξαρτάται από τον πίνακα χαρακτήρων που χρησιμοποιείται στον υπολογιστή σας κατά την εκτέλεση του κώδικα Python.

Λάβετε υπόψη ότι η παραγγελία γίνεται με διάκριση πεζών-κεφαλαίων. Ως παράδειγμα για το λατινικό αλφάβητο, το "Bus" προέρχεται από το "bus". Λίστα 2 δείχνει πώς λειτουργούν στην πράξη αυτοί οι τελεστές σύγκρισης.

Λίστα 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 από πάνω από την έξοδο έχει ως εξής:

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

Συγκρίσεις συμβολοσειρών χωρίς διάκριση πεζών-κεφαλαίων

Τα προηγούμενα παραδείγματα επικεντρώθηκαν σε ακριβείς αντιστοιχίσεις μεταξύ χορδών. Για να επιτρέπονται συγκρίσεις χωρίς διάκριση πεζών-κεφαλαίων, η Python προσφέρει ειδικές μεθόδους συμβολοσειρών όπως π.χ upper() και lower(). Και τα δύο είναι άμεσα διαθέσιμα ως μέθοδοι του αντίστοιχου αντικειμένου συμβολοσειράς.

upper() μετατρέπει ολόκληρη τη συμβολοσειρά σε κεφαλαία γράμματα και lower() με πεζά γράμματα, αντίστοιχα. Βασισμένο στο Λίστα 1 η επόμενη λίστα δείχνει πώς να χρησιμοποιήσετε το lower() μέθοδος.

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Λίστα 3:


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

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

Η έξοδος έχει ως εξής:

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

Συγκρίνετε συμβολοσειρές χρησιμοποιώντας κανονικές εκφράσεις (RegEx)

A Συνήθης έκφραση – ή «regex» για συντομία – ορίζει ένα συγκεκριμένο μοτίβο χαρακτήρων.

Για να χρησιμοποιήσετε αυτόν τον μηχανισμό στην Python, εισάγετε το re ενότητα πρώτα και ορίστε ένα συγκεκριμένο μοτίβο, στη συνέχεια. Και πάλι, το ακόλουθο παράδειγμα βασίζεται Λίστα 1. Το μοτίβο αναζήτησης ταιριάζει με το "bay" και ξεκινά είτε με πεζό είτε με κεφαλαίο γράμμα. Ακριβώς, ο ακόλουθος κώδικας Python βρίσκει όλες τις συμβολοσειρές στις οποίες εμφανίζεται το μοτίβο αναζήτησης ανεξάρτητα από τη θέση της συμβολοσειράς - στην αρχή, ή στη μέση ή στο τέλος.

Λίστα 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")

Η έξοδος είναι η εξής και ταιριάζει με τα "Bayswater", "Table Bay" και "Bombay" από τη λίστα με τα μέρη:

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

Συγκρίσεις πολλών γραμμών και λιστών

Μέχρι στιγμής οι συγκρίσεις μας ήταν μόνο με λίγες λέξεις. Χρησιμοποιώντας την difflib Η ενότητα Python προσφέρει επίσης έναν τρόπο σύγκρισης συμβολοσειρών πολλών γραμμών και ολόκληρων λιστών λέξεων. Η έξοδος μπορεί να διαμορφωθεί σύμφωνα με διάφορες μορφές εργαλείων διαφορών.

Το επόμενο παράδειγμα (Λίστα 5) συγκρίνει δύο συμβολοσειρές πολλαπλών γραμμών γραμμή προς γραμμή και εμφανίζει διαγραφές καθώς και προσθήκες. Μετά την αρχικοποίηση του Differ αντικείμενο στη γραμμή 12 η σύγκριση γίνεται χρησιμοποιώντας το compare() μέθοδος στη γραμμή 15. Το αποτέλεσμα εκτυπώνεται στην τυπική έξοδο:


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

Η εκτέλεση του σεναρίου δημιουργεί την έξοδο όπως φαίνεται παρακάτω. Οι γραμμές με διαγραφές υποδεικνύονται με - τα σημάδια ενώ οι γραμμές με προσθήκες ξεκινούν με α + σημάδι. Επιπλέον, οι γραμμές με αλλαγές ξεκινούν με ένα ερωτηματικό. Οι αλλαγές υποδεικνύονται χρησιμοποιώντας ^ σημάδια στην αντίστοιχη θέση. Οι γραμμές χωρίς ένδειξη εξακολουθούν να είναι οι ίδιες:

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

Συμπέρασμα

Σε αυτό το άρθρο έχετε μάθει διάφορους τρόπους σύγκρισης συμβολοσειρών στην Python. Ελπίζουμε ότι αυτή η επισκόπηση θα σας βοηθήσει να προγραμματίσετε αποτελεσματικά στη ζωή του προγραμματιστή σας.

Ευχαριστίες

Ο συγγραφέας θα ήθελε να ευχαριστήσει τη Mandy Neumeyer για την υποστήριξή της κατά την προετοιμασία του άρθρου.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse