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