Python para Tratamento de Dados: Como Sanitizar Strings e Remover Diacríticos

Como Remover Acentos e Caracteres Especiais de um Texto em Python

Ao processar dados de formulários, criar slugs para URLs ou higienizar strings para armazenamento em bancos de dados, acentos e caracteres especiais podem causar inconsistências de busca e falhas de codificação. Este script utiliza o módulo nativo unicodedata para decompor caracteres acentuados em seus componentes base, permitindo a remoção limpa dos diacríticos sem alterar as letras originais. A solução é ideal para padronizar textos e evitar problemas de encoding em sistemas de TI.

Python
import re
import unicodedata

def remover_acentos_e_especiais(texto: str, manter_espacos: bool = True) -> str:
    """Remove acentos e caracteres especiais de uma string mantendo letras e números."""
    if not texto:
        return ""

    # Normaliza a string decompondo caracteres acentuados (ex: 'á' vira 'a' + '´')
    texto_normalizado = unicodedata.normalize("NFD", texto)
    
    # Filtra os caracteres removendo os diacríticos (categoria 'Mn')
    texto_sem_acento = "".join(
        char for char in texto_normalizado 
        if unicodedata.category(char) != "Mn"
    )

    # Define o padrão Regex: mantém letras, números e opcionalmente espaços
    padrao = r"[^a-zA-Z0-9\s]" if manter_espacos else r"[^a-zA-Z0-9]"
    
    # Remove caracteres especiais restantes (símbolos, pontuações, etc.)
    texto_limpo = re.sub(padrao, "", texto_sem_acento)

    return texto_limpo

# --- Exemplo de uso prático ---
if __name__ == "__main__":
    texto_sujo = "Atenção! O valor do produto é R$ 1.250,00 @2026 (São Paulo/SP)."

    # 1. Removendo acentos e especiais, mas mantendo espaços
    resultado_com_espacos = remover_acentos_e_especiais(texto_sujo, manter_espacos=True)
    print("Texto sem acentos/especiais:", resultado_com_espacos)
    # Saída: "Atencao O valor do produto e R 125000 2026 Sao PauloSP"

    # 2. Gerando um slug limpo para URLs (sem espaços)
    slug = remover_acentos_e_especiais(texto_sujo, manter_espacos=False).lower()
    print("Slug gerado:", slug)
    # Saída: "atencaovalordoprodutoer1250002026saopaulosp"

Pontos-chave

  • unicodedata.normalize("NFD", ...): Aplica a Decomposição Canônica Unicode, separando os caracteres base (como a letra "a") de seus diacríticos e acentos (como "˜").

  • Categoria 'Mn' (Mark, Nonspacing): O filtro identifica e descarta apenas os símbolos de acentuação desvinculados após a normalização NFD, preservando o caractere alfabético original.

  • Expressão Regular com re.sub(): O padrão [^a-zA-Z0-9\s] garante a remoção de pontuações, pontuação ASCII e símbolos especiais (ex: @, $, !, /), mantendo a integridade de letras e números.

  • Performático e sem dependências externas: Por utilizar apenas as bibliotecas nativas unicodedata e re, o script possui custo de execução mínimo e roda em qualquer ambiente Python sem necessidade de pip install.

Comentários

Postagens mais visitadas deste blog

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Python para Computação Quântica: Introdução com Qiskit

C# e Banco de Dados: Como Conectar e Realizar Operações com SQL Server