Como fazer uma busca ignorando acentuação em Python?
Neste artigo vamos aprender uma forma simples de fazer uma busca ignorando acentuação em Python, um problema que acontece no nosso idioma.
Fala programador(a), beleza? Bora aprender mais sobre Python!
No Python temos uma maneira bem interessante e fácil de buscar em uma string ignorando a acentuação
Precisamos utilizar a biblioteca unidecode, e converter as palavras para outro encode
E assim fazer a nossa busca com acentuação ignorada, vamos ver na prática:
import unidecode
palavra = "programação"
palavraSemAcentuacao = unidecode.unidecode(palavra)
print(palavraSemAcentuacao)
if(palavraSemAcentuacao.find('cao')):
print("Encontrado!")
Aqui temos a palavra programação que tem acento, e utilizamos o método unidecode da lib unidecode para reformatar essa string sem esse acento
Depois utilizamos o find para verificar se encontramos ‘cao’ na palavra programação sem acento
E assim realizamos a busca ignorando a acentuação, veja a saída:
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 118 aulas
- 4 projetos
- 9h 33min
programacao Encontrado!
Podemos fazer isso em listas também, veja:
palavras = [
u"programação",
u"acentuação",
u"relação",
u"será",
]
def to_ascii(ls):
for i in range(len(ls)):
ls[i] = unidecode.unidecode(ls[i])
to_ascii(palavras)
print(palavras)
Aqui criamos uma função que vai remover a acentuação, ela basicamente itera a cada item da lista e utiliza o mesmo método visto anteriormente
A saída é:
['programacao', 'acentuacao', 'relacao', 'sera']
Desta maneira podemos agora buscar nesta lista sem problemas, pois a acentuação foi removida, graças a função que criamos
Conclusão
Neste artigo vimos como fazer uma busca ignorando acentuação em Python
Utilizamos a biblioteca unidecode para remover a acentuação da palavra ou das palavras em uma lista que precisamos buscar
Depois é só utilizar o método find com a string que queremos checar em cada frase ou palavra
Confira também nosso catálogo de cursos gratuitos, com aulas semanais no YouTube
Cuidado com o find:
O find não devolve verdadeiro ou falso
Ele devolve a POSIÇÃO em que o trecho aparece dentro da string
E aí mora a pegadinha: quando o texto começa exatamente com o que você procura, a posição é 0
O if lê esse 0 como falso, e a busca "some" mesmo tendo encontrado 😅
Pior: quando não encontra nada, o retorno é -1, e o if lê -1 como verdadeiro
Ou seja, dá pra errar nas duas pontas
O jeito seguro é comparar com -1, ou usar o operador in, que já entrega verdadeiro ou falso:
if palavraSemAcentuacao.find('cao') != -1:
print("Encontrado!")
# ou, bem mais legível:
if 'cao' in palavraSemAcentuacao:
print("Encontrado!")
Já me ferrei uma vez com isso e demorei pra achar o motivo…
E se a pessoa digitar em maiúsculo?
Tirar o acento resolve metade do problema, beleza?
Se o usuário digita PROGRAMAÇÃO e a sua lista tem "programação", a comparação continua falhando
Porque pra máquina P e p são caracteres diferentes
Então normalize os DOIS lados: tira o acento e baixa a caixa
import unidecode
def normalizar(texto):
return unidecode.unidecode(texto).casefold()
busca = normalizar("PROGRAMAÇÃO")
alvo = normalizar("Curso de Programação")
if busca in alvo:
print("Encontrado!")
Usei casefold no lugar do lower porque ele é mais agressivo na hora de igualar as letras, foi feito justamente pra comparação
A regra de ouro é essa: passe a busca e o texto pela MESMA função de normalização, sempre
Dá pra fazer sem instalar biblioteca externa?
Dá 😀
Às vezes você está num ambiente engessado, onde não pode sair adicionando dependência no projeto
Nesse caso o unicodedata, que faz parte da biblioteca padrão do Python, resolve
Mas antes do código, o PORQUÊ, que é a parte legal:
Um caractere acentuado pode ser representado de duas formas diferentes
Ou como um símbolo único (o ã inteiro), ou como a letra base mais o acento em separado (a + til)
O normalize com NFD faz exatamente essa separação
Depois é só jogar fora os pedacinhos que são acento, e sobra a letra limpa:
import unicodedata
def sem_acento(texto):
decomposto = unicodedata.normalize('NFD', texto)
return ''.join(c for c in decomposto if not unicodedata.combining(c))
print(sem_acento("programação"))
A saída é:
programacao
O combining é quem responde "esse caractere é um acento grudado na letra anterior?"
Se for, a gente descarta, e é isso 🙂
unidecode ou unicodedata: qual escolher?
Depende do que o seu projeto pede
Se a ideia é só tratar texto em português num filtro ou num campo de busca, o unicodedata dá conta e você não adiciona dependência nenhuma
Se você prefere uma função pronta, sem lidar com normalização na mão, o unidecode faz esse trabalho por você, como vimos lá em cima
Na prática: comece pelo caminho mais simples pro seu cenário, e troque quando aparecer texto que a normalização sozinha não estiver resolvendo
O que não muda é a ideia central, normalizar os dois lados antes de comparar
Filtrando a lista sem estragar a original:
Repara numa coisa: a função ali de cima altera a lista original
Funciona, mas você PERDE as palavras com acento
E normalmente você quer o contrário: comparar pela versão sem acento e mostrar o texto bonitinho pro usuário
Dá pra separar as duas coisas assim:
palavras = [
"programação",
"acentuação",
"relação",
"será",
]
def normalizar(texto):
return unidecode.unidecode(texto).casefold()
busca = normalizar("acentuacao")
print(encontradas)
A saída é:
Se liga que a lista original continua intacta, com acento e tudo
E um detalhe que envelheceu no exemplo anterior: aquele u antes das aspas (u"programação") é herança do Python 2
No Python 3 toda string já é unicode, então pode escrever normal, sem o u na frente
Onde isso aparece no dia a dia:
Campo de busca do site: a pessoa digita "sao paulo" e o seu cadastro tem "São Paulo"
Filtro de lista: comparar nome de cidade, de produto, de categoria
Cruzar dados de duas fontes: uma planilha veio com acento, a outra veio sem, e os registros não batem
Ordenação alfabética: sem normalizar, as palavras acentuadas caem em posições estranhas na ordem
Em todos esses casos a receita é a mesma
Normaliza a busca, normaliza o texto, compara as duas versões normalizadas e guarda o original pra exibir
Simples assim 🙂
Leia também
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares

Como limitar números decimais em Python?
Adicionar uma seção sobre f-strings, o jeito mais usado hoje pra formatar casa decimal. Exemplo: valor = 3.14159 e print(f"{valor:.2f}") mostrando 3.14. Explicar que o […]
Como programar Python [dicas e códigos iniciantes aqui]
Python é uma linguagem de programação muito popular e uma de alto nível utilizada em diferentes tipos de aplicações, como para o desenvolvimento web, em Machine […]

Como inverter uma string em Python
Neste artigo você vai aprender a como inverter uma string em Python, de uma maneira simples para você utilizar em seus programas Conteúdo também disponível […]

