Comparar cadenas de una manera insensible a mayúsculas y minúsculas parece trivial, pero no lo es. Usaré Python 3, ya que Python 2 está subdesarrollado aquí.
Lo primero a tener en cuenta es que las conversiones de eliminación de mayúsculas y minúsculas en Unicode no son triviales. Hay texto para el cual text.lower() != text.upper().lower()
, como "ß"
:
"ß".lower()
#>>> 'ß'
"ß".upper().lower()
#>>> 'ss'
Pero digamos que querías comparar "BUSSE"
y sin caso "Buße"
. Demonios, probablemente también quieras comparar "BUSSE"
e "BUẞE"
igualar, esa es la nueva forma de capital. La forma recomendada es usar casefold
:
str. casefold ()
Devuelve una copia de la cadena con mayúsculas y minúsculas. Las cadenas plegadas en mayúsculas y minúsculas se pueden usar para la coincidencia sin mayúsculas y minúsculas.
El plegado de mayúsculas y minúsculas es similar a las minúsculas pero más agresivo porque tiene la intención de eliminar todas las distinciones de mayúsculas y minúsculas en una cadena. [...]
No solo lo use lower
. Si casefold
no está disponible, hacer .upper().lower()
ayuda (pero solo un poco).
Entonces deberías considerar los acentos. Si su renderizador de fuentes es bueno, probablemente piense "ê" == "ê"
, pero no es así:
"ê" == "ê"
#>>> False
Esto se debe a que el acento en este último es un carácter combinado.
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 forma más sencilla de lidiar con esto es unicodedata.normalize
. Probablemente desee utilizar la normalización de NFKD , pero no dude en consultar la documentación. Entonces uno hace
unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "ê")
#>>> True
Para terminar, aquí se expresa en funciones:
import unicodedata
def normalize_caseless(text):
return unicodedata.normalize("NFKD", text.casefold())
def caseless_equal(left, right):
return normalize_caseless(left) == normalize_caseless(right)
Σίσυφος
yΣΊΣΥΦΟΣ
, entonces su enfoque falla, porque se supone que esas son las mismas mayúsculas y minúsculas.