Confrontare le stringhe in modo insensibile alle maiuscole sembra banale, ma non lo è. Userò Python 3, poiché Python 2 è sottosviluppato qui.
La prima cosa da notare è che le conversioni che rimuovono i casi in Unicode non sono banali. Esiste un testo per il quale text.lower() != text.upper().lower()
, ad esempio "ß"
:
"ß".lower()
#>>> 'ß'
"ß".upper().lower()
#>>> 'ss'
Ma supponiamo che tu voglia confrontare senza casaccio "BUSSE"
e "Buße"
. Diamine, probabilmente vorrai anche confrontare "BUSSE"
e "BUẞE"
uguagliare: questa è la forma di capitale più recente. Il modo raccomandato è usare casefold
:
str. casefold ()
Restituisce una copia piegata a maiuscolo della stringa. Le stringhe piegate a lettere possono essere utilizzate per la corrispondenza senza casing.
Il casefolding è simile al minuscolo ma più aggressivo perché è destinato a rimuovere tutte le distinzioni del caso in una stringa. [...]
Non usare solo lower
. Se casefold
non è disponibile, fare .upper().lower()
aiuti (ma solo un po ').
Quindi dovresti considerare gli accenti. Se il tuo renderizzatore di caratteri è buono, probabilmente pensi "ê" == "ê"
, ma non lo fa:
"ê" == "ê"
#>>> False
Questo perché l'accento su quest'ultimo è un personaggio che combina.
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']
Il modo più semplice per affrontarlo è unicodedata.normalize
. Probabilmente vuoi usare la normalizzazione NFKD , ma sentiti libero di controllare la documentazione. Quindi uno lo fa
unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "ê")
#>>> True
Per finire, qui questo è espresso in funzioni:
import unicodedata
def normalize_caseless(text):
return unicodedata.normalize("NFKD", text.casefold())
def caseless_equal(left, right):
return normalize_caseless(left) == normalize_caseless(right)
Σίσυφος
eΣΊΣΥΦΟΣ
, allora il tuo approccio fallisce, perché si suppone che siano lo stesso caso insensibilmente.