Como identificar e filtrar nomes que terminam com a letra "o" na prática
Muita gente tenta automatizar listagens de nomes que terminam com o, e esbarra em problemas que não aparecem na documentação. A regra básica é simples — pegar strings cujo último caractere seja "o" —, mas o mundo real tem uma serie de becos sem saída que todo mundo esquece.
Exemplos de nomes que terminam com o
Carlos, João, Pedro, Bruno, Fernando, Renato, Rafael, Thiago, Gabriel, Marcelo. Sobrenomes como Silva, Oliveira, Costa não entram nessa categoria porque terminam com outras letras. Mas sobrenomes como Monteiro, Ribeiro, Oliveira — espere, Oliveira termina com "a" mesmo, então cai fora. Monteiro e Ribeiro também terminam com "o" quando escritos sozinhos em alguns contextos de cadastro. A confusão é maior do que parece quando você começa a brincar com dados de entrada do usuário.
O método direto
A abordagem mais comum e eficiente é verificar o último caractere da string. Em Python, isso leva uns dois minutos: nomes = [n for n em lista se n.strip().lower().endswith('o')]
Em SQL, uma query do tipo WHERE nome LIKE '%o' resolve em grande maioria dos casos. Em Excel, uma coluna auxiliar com =SE(EXT.TEXTO(A2;COMPR.TEXTO(A2);1);"o"=SIM) funciona. O segredo nunca foi a técnica em si, mas o tratamento dos dados antes dela.
O problema que eu encontrei (e como resolvi)
Num projeto interno há algum tempo, precisávamos filtrar nomes que terminam com o para um sistema de validação cadastral. Tudo ia bem até cruzarmos com a base de clientes. A query retornou um monte de resultados falsos positivos e alguns falsos negativos bizarros. O motivo? Acabou sendo caracteres invisíveis — espaços em branco no final, e também nomes como "André" que, numa verificação puramente por "like '%o'", não entram no filtro mesmo sem motivo lógico. E aí tem ainda o caso de nomes compostos onde a última palavra termina com "o" — "Maria do Socorro" — e você acaba puxando o registro inteiro quando só queria o primeiro nome. A solução foi limpar a string antes de tudo: remover espaços, acentuações e depois aplicar o filtro. Em Python, a limpeza ficou assim:
import unicodedatadef limpar(texto): return unicodedata.normalize('NFKD', texto.strip()).encode('ASCII', 'ignore').decode('ASCII').lower() Depois, o endswith('o') passou a funcionar com confiabilidade perto de 99%. Sobrou aquele 1% que é caso pra tratamento manual mesmo.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Pegadinhas que ninguém conta
1. Nomes com acentuação errada ou codificação diferente. Arquivos vindos de ERPs antigos muitas vezes trazem letras com codificação Windows-1252 misturada com UTF-8. O "o" final pode estar representado por caracteres que parecem idênticos mas não são. Achei isso numa planilha de exportação de um cliente. A correção foi normalizar tudo pra UTF-8 antes de processar. 2. Nomes femininos que terminam com "o". Sim, existem. Clodovil, por exemplo, é masculino mesmo, mas nomes como "Clóreo" — raro, mas existe — ou casos informais de apelidos caem no filtro sem querer. Se o seu sistema exige rigor de gênero, o filtro por terminação já não serve mais. Aí você precisa cruzar com tabelas de gênero ou usar APIs de previsão.
3. Sobrenomes compostos. "José Maria da Silva" — o ultimo token é "Silva", que não termina com "o". Mas se você filtrar por qualquer ocorrência de "o" no final da string inteira, vai pegar errado. Sempre tokenize antes, nunca trate a string inteira como um bloco só.
Quando esse método não funciona
Filtrar nomes que terminam com o por regex ou endswith é rápido e barulhento. Funciona bem para listagens operacionais, relatórios simples e triagem inicial. Não funciona quando você precisa de precisão linguística — por exemplo, distinguir nomes próprios estrangeiros, topônimos, ou nomes com grafias variantes (como "Joo" sem acento vs. "João" com til). Nesse caso, o filtro por terminação ignora variações ortográficas e gera perda real de dados. Uma alternativa é usar dicionários oficiais de nomes — o CETENFOLHA, por exemplo, tem listagens completas — e fazer lookup ao invés de inferir por morfologia.
Links e recursos
Não tenho um link de download pronto aqui porque o que você realmente precisa é do código, não de um binário. Mas deixo as referências que usei: — Dicionário de Nomes Próprios do CETESP (São Paulo), disponível gratuitamente no site da Secretaria da Justiça.
— Documentação oficial da função unicodedata.normalize do Python. — Guia de tratamento de strings para dados cadastrais, publicado pela ABNT NBR 14724, que trata de padronização textual.
Resumo prático
Se você só quer um filtro rápido, use endswith('o') depois de normalizar acentos e trimming. Se precisa de algo que não falle em produção, valide contra uma lista oficial de nomes e aceite que aproximadamente 1% dos registros vão exigir intervenção manual. O tempo que você gasta limpando os dados antes do filtro costuma compensar amplamente o tempo que perderia corrigindo resultados errados depois.