Módulo 12 - Trabalhando com textos

Prática: formatador de nomes

11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Montar um pipeline de limpeza: strip, lower e split em sequência.
  • Capitalizar um nome respeitando conectivos como da, de e dos.
  • Contar as letras do nome sem os espaços e extrair as iniciais.
  • Ler e escrever um programa completo que encadeia os métodos do módulo.

A missão: do nome bagunçado ao nome padronizado

Todo sistema de cadastro do mundo enfrenta o mesmo inimigo: gente digitando nome de qualquer jeito. Caps Lock ligado, espaço antes, espaço depois, tudo minúsculo. Se o sistema guarda o que recebeu, o banco de dados vira um museu de horrores, com MARIA, maria e Maria convivendo como se fossem três pessoas. A prática deste módulo ataca exatamente esse problema, com as ferramentas que você acabou de aprender. O contrato do programa é claro:

Digite o nome completo:   joão da SILVA 

=== NOME PADRONIZADO ===
Nome: João da Silva
Letras (sem espaços): 11
Iniciais: J.S.

A entrada bagunçada em cima, a saída civilizada embaixo. Esse é o alvo.

Antes de olhar qualquer código, tente enxergar as etapas. O nome chega com sujeira nas pontas: aula 2, .strip(). A caixa está bagunçada: aula 1, .lower() para zerar tudo. Para tratar palavra por palavra, é preciso separá-las: aula 5, .split(). Cada palavra ganha inicial maiúscula, menos os conectivos. E no fim, .join() para remontar, len() com .replace() para contar as letras, e a primeira letra de cada palavra principal para as iniciais. O módulo inteiro está nesse parágrafo.

Construindo passo a passo

Primeira etapa: o pipeline de limpeza. Três métodos encadeados transformam o texto cru numa lista de palavras minúsculas e limpas. Repare que o .split() sem argumento já perdoa espaços duplicados no meio do nome, como você viu na aula passada.

entrada = "  joão da SILVA "

palavras = entrada.strip().lower().split()
print(palavras)   # ['joão', 'da', 'silva']

Uma linha, três transformações: pontas limpas, caixa zerada, palavras separadas.

Segunda etapa: capitalizar respeitando os conectivos. A estratégia é percorrer a lista com o for do módulo 9 e decidir, com o if do módulo 7, o destino de cada palavra: se ela é um conectivo, entra na nova lista como está, minúscula; senão, entra com .capitalize(). Os conectivos moram numa lista de consulta, e o operador in do módulo 10 faz a checagem.

CONECTIVOS = ["da", "de", "do", "das", "dos", "e"]

formatadas = []
for palavra in palavras:
    if palavra in CONECTIVOS:
        formatadas.append(palavra)
    else:
        formatadas.append(palavra.capitalize())

nome_formatado = " ".join(formatadas)
print(nome_formatado)   # João da Silva

O for decide palavra a palavra e o join remonta o nome com espaços simples.

Terceira etapa: os extras. As letras são contadas na versão formatada, removendo os espaços antes de medir: len(nome_formatado.replace(" ", "")). Para as iniciais, o programa percorre as palavras formatadas, pula os conectivos (as iniciais de João da Silva são J e S, o d não entra) e pega o primeiro caractere de cada uma com palavra[0], o acesso por posição que você conheceu ao percorrer textos no módulo 9. Cada inicial ganha um ponto na sequência.

Código final e desafios extras

Aqui está o programa completo, montado com as peças das seções anteriores. Digite, rode e compare com o contrato da primeira seção.

# Formatador de nomes - prática do módulo 12
CONECTIVOS = ["da", "de", "do", "das", "dos", "e"]

entrada = input("Digite o nome completo: ")
palavras = entrada.strip().lower().split()

formatadas = []
for palavra in palavras:
    if palavra in CONECTIVOS:
        formatadas.append(palavra)
    else:
        formatadas.append(palavra.capitalize())

nome_formatado = " ".join(formatadas)
letras = len(nome_formatado.replace(" ", ""))

iniciais = ""
for palavra in formatadas:
    if palavra not in CONECTIVOS:
        iniciais = iniciais + palavra[0] + "."

print("\n=== NOME PADRONIZADO ===")
print(f"Nome: {nome_formatado}")
print(f"Letras (sem espaços): {letras}")
print(f"Iniciais: {iniciais}")

O formatador completo: 20 e poucas linhas que usam todas as aulas do módulo.

Vale a leitura em voz alta, de cima a baixo: limpe e separe a entrada; para cada palavra, preserve conectivo ou capitalize; junte com espaços; conte as letras sem espaço; colete a primeira letra de cada palavra principal; apresente tudo com f-strings. Se cada linha fez sentido, o módulo cumpriu o papel. Se alguma travou, o número do módulo dela está no fluxo desta prática: strip e lower na aula certa, split e join na aula 5, e assim por diante.

Um teste de fronteira que vale rodar: digite só espaços e Enter. O .split() devolve lista vazia, o programa imprime nome em branco, zero letras e nenhuma inicial, sem quebrar. Dá para melhorar recusando entrada vazia com um if logo após a leitura, e essa é uma boa emenda sua. No módulo 14, com try e except, a validação de entrada vira assunto oficial.

  1. Desafio 1, assinatura de e-mail: gere primeiro.ultimo em minúsculas a partir do nome formatado, como joao.silva, usando palavras[0] e a última palavra da lista. Imprima como sugestão de e-mail: joao.silva no provedor da empresa.
  2. Desafio 2, citação ABNT simples: mostre o nome no formato SOBRENOME, Nome, como SILVA, João da, com o último sobrenome em .upper() na frente e o restante do nome depois da vírgula.
  3. Desafio 3, crachá: imprima o nome formatado entre duas linhas de = do mesmo tamanho do nome, usando len() para calcular quantos sinais de igual desenhar e a multiplicação de string "=" * tamanho do módulo 6.

Os desafios não têm gabarito de propósito: cada um se resolve com métodos desta aula mais o que os módulos anteriores deixaram na sua caixa de ferramentas. Se travar num deles, releia a seção do método envolvido e tente de novo no dia seguinte. No próximo módulo, o curso dá o salto de organização mais importante da trilha: funções, o jeito de dar nome e reaproveitar blocos como este formatador.

Teste rápido

No formatador, por que a linha entrada.strip().lower().split() usa os três métodos NESSA ordem de propósito?

Perguntas frequentes

Por que usar .capitalize() em cada palavra em vez de .title() no nome inteiro?
Porque o .title() capitaliza todas as palavras, inclusive os conectivos: João Da Silva. Capitalizando palavra a palavra, o programa consegue decidir caso a caso, preservando da, de e parentes em minúsculas, que é a escrita correta de nomes em português. É o exemplo clássico de quando a ferramenta pronta quase serve, e o quase obriga a escrever quatro linhas próprias.
E se o nome começar com um conectivo, como em De Souza?
O programa desta prática deixaria o de minúsculo mesmo no início, o que é discutível para sobrenomes registrados assim. Tratar o caso é um bom desafio extra: basta capitalizar sempre a primeira palavra da lista, independentemente de ser conectivo, com um if usando a posição. Sistemas reais de cadastro enfrentam exatamente esse tipo de decisão.
Por que a lista CONECTIVOS está em letras maiúsculas no nome da variável?
É uma convenção do Python para constantes, valores que o programa define uma vez e nunca altera. O nome em maiúsculas avisa quem lê: isto é configuração, não dado que muda durante a execução. A linguagem não impõe a regra, mas o guia de estilo oficial, a PEP 8, a recomenda, e todo código profissional a segue.
O que acontece se o usuário digitar números ou símbolos no meio do nome?
O programa não valida isso: jo4o viraria Jo4o, obediente e errado. Validar conteúdo, aceitando só letras e espaços, pede o método .isalpha() combinado com as condições que você já sabe, e é uma extensão natural depois do módulo 14. Nesta prática, o foco é a formatação; a blindagem completa vem com o tratamento de erros.
Por que as iniciais pulam os conectivos?
Por convenção de escrita: as iniciais de João da Silva são J.S., não J.d.S. Iniciais destacam os nomes principais da pessoa. Como a lista de conectivos já existe no programa, pular é um if not in dentro do for, e você ganha de brinde um exemplo de reuso: a mesma constante serve à capitalização e às iniciais.
Esse formatador serviria num sistema de verdade?
Como núcleo, sim: limpar, normalizar e capitalizar com exceções é o que sistemas reais fazem com nomes. Faltariam camadas que o curso ainda vai construir: validação robusta de entrada (módulo 14), gravação em arquivo (módulo 15) e organização em funções reutilizáveis (módulo 13). O projeto final junta essas peças; o formatador é um tijolo honesto no caminho.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.