Comparer des chaînes de façon insensible à la casse semble trivial, mais ce n'est pas le cas. J'utiliserai Python 3, car Python 2 est sous-développé ici.
La première chose à noter est que les conversions de suppression de cas dans Unicode ne sont pas triviales. Il existe des textes pour lesquels text.lower() != text.upper().lower()
, tels que "ß"
:
"ß".lower()
#>>> 'ß'
"ß".upper().lower()
#>>> 'ss'
Mais disons que vous vouliez comparer sans casse "BUSSE"
et "Buße"
. Heck, vous voulez probablement aussi comparer "BUSSE"
et "BUẞE"
égaliser - c'est la nouvelle forme de capital. La méthode recommandée consiste à utiliser casefold
:
str. casefold ()
Renvoie une copie de la chaîne de caractères. Des cordes pliées peuvent être utilisées pour l'appariement sans boîtier.
Le casefolding est similaire à la minuscule mais plus agressif car il est destiné à supprimer toutes les distinctions de casse dans une chaîne. [...]
N'utilisez pas seulement lower
. Si casefold
n'est pas disponible, faire .upper().lower()
aide (mais seulement un peu).
Ensuite, vous devriez considérer les accents. Si votre rendu de police est bon, vous pensez probablement"ê" == "ê"
- mais ce n'est pas le cas:
"ê" == "ê"
#>>> False
En effet, l'accent sur ce dernier est un caractère combinatoire.
import unicodedata
[unicodedata.name(char) for char in "ê"]
#>>> ['LATIN SMALL LETTER E WITH CIRCUMFLEX']
[unicodedata.name(char) for char in "ê"]
#>>> ['LATIN SMALL LETTER E', 'COMBINING CIRCUMFLEX ACCENT']
La façon la plus simple de résoudre ce problème est unicodedata.normalize
. Vous souhaitez probablement utiliser la normalisation NFKD , mais n'hésitez pas à consulter la documentation. Alors on fait
unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "ê")
#>>> True
Pour finir, cela s'exprime ici en fonctions:
import unicodedata
def normalize_caseless(text):
return unicodedata.normalize("NFKD", text.casefold())
def caseless_equal(left, right):
return normalize_caseless(left) == normalize_caseless(right)
Σίσυφος
etΣΊΣΥΦΟΣ
, alors votre approche échoue, car celles-ci sont censées être le même cas de manière insensible.