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.

busca ignorando acentuacao no python capa

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
Formação Recomendada

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

Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Blog | Mais populares