Comparar strings de uma maneira que não diferencia maiúsculas de minúsculas parece trivial, mas não é. Eu vou usar o Python 3, pois o Python 2 é subdesenvolvido aqui.
A primeira coisa a observar é que as conversões de remoção de maiúsculas e minúsculas no Unicode não são triviais. Há texto para o qual text.lower() != text.upper().lower()
, como "ß"
:
"ß".lower()
#>>> 'ß'
"ß".upper().lower()
#>>> 'ss'
Mas digamos que você queria comparar "BUSSE"
e "Buße"
. Caramba, você provavelmente também quer comparar "BUSSE"
e "BUẞE"
igualar - essa é a nova forma de capital. A maneira recomendada é usar casefold
:
str. casefold ()
Retorne uma cópia dobrada em caixa da sequência. As cordas dobradas em caixa podem ser usadas para correspondência sem caixa.
A dobragem de caixa é semelhante à minúscula, mas é mais agressiva porque se destina a remover todas as distinções de maiúsculas e minúsculas em uma sequência. [...]
Não use apenas lower
. Se casefold
não estiver disponível, fazer .upper().lower()
ajuda (mas apenas um pouco).
Então você deve considerar sotaques. Se o seu renderizador de fontes é bom, você provavelmente pensa "ê" == "ê"
- mas não:
"ê" == "ê"
#>>> False
Isso ocorre porque o sotaque desse último é um personagem 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']
A maneira mais simples de lidar com isso é unicodedata.normalize
. Você provavelmente deseja usar a normalização do NFKD , mas fique à vontade para verificar a documentação. Então se faz
unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "ê")
#>>> True
Para finalizar, aqui isso é expresso em funções:
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ΣΊΣΥΦΟΣ
, então, sua abordagem falha, porque essas devem ser o mesmo caso sem sensibilidade.