Comparaison de chaînes à l'aide de Python

En Python, les chaînes sont des séquences de caractères, qui sont effectivement stockées en mémoire en tant qu'objet. Chaque objet peut être identifié à l'aide du id() méthode, comme vous pouvez le voir ci-dessous. Python essaie de réutiliser les objets en mémoire qui ont la même valeur, ce qui rend également la comparaison des objets très rapide en 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()

Afin de comparer des chaînes, Python propose plusieurs opérateurs différents pour le faire. Tout d’abord, nous les expliquerons plus en détail ci-dessous. Deuxièmement, nous passerons en revue à la fois string et les terres parsemées de re modules, qui contiennent des méthodes pour gérer les correspondances insensibles à la casse et inexactes. Troisièmement, pour gérer les chaînes multilignes, module difflib est assez pratique. De nombreux exemples vous aideront à comprendre comment les utiliser.

Comparez les chaînes avec les opérateurs == et !=

En tant qu'opérateur de comparaison de base, vous souhaiterez utiliser == et les !=. Ils fonctionnent exactement de la même manière qu’avec les valeurs entières et flottantes. Le == retour de l'opérateur True s'il y a une correspondance exacte, sinon False sera restitué. En revanche, le != retour de l'opérateur True s'il n'y a pas de correspondance et sinon renvoie False. Annonce 1 le démontre.

Dans un for boucle, une chaîne contenant le nom de la ville suisse « Lausanne » est comparée à une entrée d'une liste d'autres lieux, et le résultat de la comparaison est imprimé sur la sortie standard.

Liste 1:


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

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

L'exécution du script Python au-dessus de la sortie est la suivante :

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

Le == et les is Les opérateurs

Python a les deux opérateurs de comparaison == et les is. À première vue, ils semblent être les mêmes, mais en réalité ce n’est pas le cas.

== compare deux variables en fonction de la valeur qu'elles représentent. En revanche, le is L'opérateur compare deux variables en fonction de l'ID de l'objet en mémoire.

John (Doe) et John (Moe) s'appellent tous deux John. Si nous pouvons les réduire à leurs seuls noms, ils auraient la même valeur, mais seraient toujours deux personnes qualitativement différentes.

L'exemple suivant montre cela pour trois variables avec des valeurs de chaîne. Les deux variables a et les b ont la même valeur et Python fait référence au même objet afin de minimiser l'utilisation de la mémoire.

Ceci est fait par défaut pour les types simples et les chaînes, mais pas pour les autres objets :

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

Dès que la valeur change, Python réinstanciera l'objet et attribuera la variable. Dans le prochain extrait de code b obtient la valeur de 2, et par la suite b et les c faire référence au même objet :

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

Plus d'opérateurs de comparaison

Pour une comparaison concernant un ordre lexicographique vous pouvez utiliser les opérateurs de comparaison <, >, <=et une >=. La comparaison elle-même se fait caractère par caractère. L'ordre dépend de l'ordre des caractères dans l'alphabet. Cet ordre dépend de la table de caractères utilisée sur votre machine lors de l'exécution du code Python.

Gardez à l’esprit que la commande est sensible à la casse. A titre d'exemple pour l'alphabet latin, « Bus » vient avant « bus ». Annonce 2 montre comment ces opérateurs de comparaison fonctionnent dans la pratique.

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

L'exécution du script Python au-dessus de la sortie est la suivante :

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

Comparaisons de chaînes insensibles à la casse

Les exemples précédents se concentraient sur les correspondances exactes entre les chaînes. Pour permettre des comparaisons insensibles à la casse, Python propose des méthodes de chaîne spéciales telles que upper() et les lower(). Les deux sont directement disponibles en tant que méthodes de l’objet chaîne correspondant.

upper() convertit la chaîne entière en lettres majuscules, et lower() en lettres minuscules, respectivement. Basé sur Annonce 1 la liste suivante montre comment utiliser le lower() méthode.

Consultez notre guide pratique et pratique pour apprendre Git, avec les meilleures pratiques, les normes acceptées par l'industrie et la feuille de triche incluse. Arrêtez de googler les commandes Git et en fait apprendre il!

Liste 3:


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

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

La sortie est la suivante:

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

Comparer des chaînes à l'aide d'expressions régulières (RegEx)

A Expression régulière – ou « regex » en abrégé – définit un modèle spécifique de caractères.

Pour utiliser ce mécanisme en Python, importez le re module d'abord et définir un modèle spécifique, ensuite. Encore une fois, l'exemple suivant est basé sur Annonce 1. Le modèle de recherche correspond à « baie » et commence par une lettre minuscule ou majuscule. Plus précisément, le code Python suivant trouve toutes les chaînes dans lesquelles le modèle de recherche apparaît, quelle que soit la position de la chaîne : au début, au milieu ou à la fin.

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

Le résultat est le suivant et correspond à « Bayswater », « Table Bay » et « Bombay » dans la liste des lieux :

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

Comparaisons multilignes et listes

Jusqu’à présent, nos comparaisons n’ont porté que sur quelques mots. En utilisant le difflib Le module Python offre également un moyen de comparer des chaînes multilignes et des listes entières de mots. La sortie peut être configurée selon différents formats d'outils de comparaison.

L'exemple suivant (Annonce 5) compare deux chaînes multilignes ligne par ligne et affiche les suppressions ainsi que les ajouts. Après l'initialisation du Differ objet à la ligne 12, la comparaison est effectuée en utilisant le compare() méthode à la ligne 15. Le résultat est imprimé sur la sortie standard :


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

L'exécution du script crée la sortie comme indiqué ci-dessous. Les lignes avec des suppressions sont indiquées par - signes alors que les lignes avec des ajouts commencent par un + signe. De plus, les lignes comportant des modifications commencent par un point d'interrogation. Les modifications sont indiquées à l'aide de ^ signes à la position correspondante. Les lignes sans indicateur sont toujours les mêmes :

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

Conclusion

Dans cet article, vous avez appris différentes manières de comparer des chaînes en Python. Nous espérons que cet aperçu vous aidera à programmer efficacement dans la vie de votre développeur.

Remerciements

L'auteur tient à remercier Mandy Neumeyer pour son soutien lors de la préparation de l'article.

Horodatage:

Plus de Stackabuse