Validação Matemática de CPF em Python Sem Usar Bibliotecas Externas

Validação Matemática de CPF em Python Sem Usar Bibliotecas Externas

A validação de CPF é um requisito fundamental em formulários de cadastro, checkout de e-commerces e sistemas administrativos no Brasil. Utilizando um algoritmo matemático simples, é possível calcular os dois últimos dígitos verificadores (DV) para garantir que a sequência informada possui uma estrutura válida sem a necessidade de consultar APIs externas.

Python
import re

def validar_cpf(cpf: str) -> bool:
    # 1. Limpa o texto mantendo apenas dígitos numéricos
    cpf_limpo = re.sub(r'\D', '', cpf)

    # Verifica se possui 11 dígitos ou se é uma sequência repetida conhecida
    if len(cpf_limpo) != 11 or cpf_limpo == cpf_limpo[0] * 11:
        return False

    # 2. Cálculo do 1º Dígito Verificador
    soma = sum(int(cpf_limpo[i]) * (10 - i) for i in range(9))
    resto = (soma * 10) % 11
    digito_1 = resto if resto < 10 else 0

    if int(cpf_limpo[9]) != digito_1:
        return False

    # 3. Cálculo do 2º Dígito Verificador
    soma = sum(int(cpf_limpo[i]) * (11 - i) for i in range(10))
    resto = (soma * 10) % 11
    digito_2 = resto if resto < 10 else 0

    if int(cpf_limpo[10]) != digito_2:
        return False

    return True

# Exemplo prático de uso
if __name__ == "__main__":
    cpfs_para_testar = [
        "111.111.111-11",  # Inválido (Sequência repetida)
        "529.482.210-25",  # Válido (Formato tradicional)
        "52948221025",     # Válido (Apenas números)
        "123.456.789-00"   # Inválido (Dígitos verificadores incorretos)
    ]

    for c in cpfs_para_testar:
        status = "Válido" if validar_cpf(c) else "Inválido"
        print(f"CPF {c}: {status}")

Pontos-chave

  • Tratamento de Expressão Regular (re.sub): A máscara r'\D' remove qualquer caractere não numérico (pontos, traços e espaços), permitindo que a função processe CPFs formatados ou compostos por apenas números.

  • Validação de Sequências Repetidas: Números como "00000000000" ou "11111111111" passam pelo algoritmo matemático dos dígitos verificadores, mas são CPFs inválidos; a verificação cpf_limpo == cpf_limpo[0] * 11 elimina esses casos na borda.

  • Algoritmo do Módulo 11: O cálculo multiplica os primeiros 9 e 10 dígitos por pesos decrescentes (de 10 a 2 e de 11 a 2, respectivamente), aplicando o resto da divisão por 11 para definir os dois últimos dígitos.

  • Validação Sintática vs. Receita Federal: Este algoritmo valida exclusivamente a consistência matemática dos dígitos verificadores. Ele não confirma se o CPF pertence a uma pessoa física existente nem se o documento está ativo na Receita Federal.

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