Skip to content

Instantly share code, notes, and snippets.

@rodrigocorreaecastro
Last active October 9, 2025 16:15
Show Gist options
  • Select an option

  • Save rodrigocorreaecastro/9c77e679cac0d3a25d28dd9b09cac965 to your computer and use it in GitHub Desktop.

Select an option

Save rodrigocorreaecastro/9c77e679cac0d3a25d28dd9b09cac965 to your computer and use it in GitHub Desktop.
Validador de CNPJ ou CPF, ajusta a mascara conforme o tipo
def limpar_numero(numero: str) -> str:
"""Remove tudo que não for dígito e tira zeros à esquerda."""
return re.sub(r'\D', '', numero).lstrip('0')
def validar_cpf(cpf: str) -> bool:
"""Valida CPF (somente números)."""
cpf = cpf.zfill(11) # garante 11 dígitos
if len(cpf) != 11 or cpf == cpf[0] * 11:
return False
soma1 = sum(int(cpf[i]) * (10 - i) for i in range(9))
resto1 = (soma1 * 10) % 11
if resto1 == 10:
resto1 = 0
if resto1 != int(cpf[9]):
return False
soma2 = sum(int(cpf[i]) * (11 - i) for i in range(10))
resto2 = (soma2 * 10) % 11
if resto2 == 10:
resto2 = 0
return resto2 == int(cpf[10])
def validar_cnpj(cnpj: str) -> bool:
"""Valida CNPJ (somente números)."""
cnpj = limpar_numero(cnpj)
if len(cnpj) != 14 or cnpj == cnpj[0] * 14:
return False
pesos1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
pesos2 = [6] + pesos1
soma1 = sum(int(cnpj[i]) * pesos1[i] for i in range(12))
resto1 = soma1 % 11
digito1 = 0 if resto1 < 2 else 11 - resto1
soma2 = sum(int(cnpj[i]) * pesos2[i] for i in range(13))
resto2 = soma2 % 11
digito2 = 0 if resto2 < 2 else 11 - resto2
return cnpj[-2:] == f"{digito1}{digito2}"
def identificar_tipo(numero: str) -> str:
"""Determina se o número é CPF ou CNPJ (tentando ambos)."""
num = limpar_numero(numero)
if len(num) <= 11:
return "CPF"
return "CNPJ"
"""
Forma de uso
-----------------------------------------------------------
resultado = validar_cnpj_cpf_multiplos(numeros)
for r in resultado:
status = "✅ Válido" if r["valido"] else "❌ Inválido"
print(f"{r['numero']} → {r['tipo']} → {status}")
"""
def validar_cnpj_cpf_multiplos(lista):
"""Analisa uma lista de números e informa tipo e validade."""
resultados = []
for numero in lista:
num_limpo = limpar_numero(numero)
# Tenta completar com zeros à esquerda para 11 (CPF) ou 14 (CNPJ)
if len(num_limpo) <= 11:
tipo = "CPF"
num_completo = num_limpo.zfill(11)
valido = validar_cpf(num_completo)
else:
tipo = "CNPJ"
num_completo = num_limpo.zfill(14)
valido = validar_cnpj(num_completo)
resultados.append({
"numero": num_completo,
"tipo": tipo,
"valido": valido
})
return resultados
"""
Forma de uso
-----------------------------------------------------------
resultado = validar_cnpj_cpf_individual(entrada)
status = "✅ Válido" if resultado["valido"] else "❌ Inválido"
print(f"{resultado['numero']} → {resultado['tipo']} → {status}")
"""
def validar_cnpj_cpf_individual(numero: str) -> dict:
"""
Analisa um único número e retorna:
{
"numero": <original>,
"tipo": "CPF" ou "CNPJ",
"valido": True/False
}
"""
num_limpo = limpar_numero(numero)
if len(num_limpo) <= 11:
tipo = "CPF"
num_completo = num_limpo.zfill(11)
valido = validar_cpf(num_completo)
else:
tipo = "CNPJ"
num_completo = num_limpo.zfill(14)
valido = validar_cnpj(num_completo)
return {
"numero": num_completo,
"tipo": tipo,
"valido": valido
}
import re
# crie um diretorio chamado utils e coloque o arquivo functions.py dentro
from utils.functions import *
# ============================
# EXEMPLO DE USO MULTIPLO
# ============================
numeros = [
"00087797474508","00038002387724","00011790013623","00035672651640",
"00034492179682","00008779747450","00000000000000","00012345678901",
"00035672651641","00034492179683","01484546000128","21957808000131",
"67233623000185","65395440000130","65082404000117","00148454600012",
"00000000000000","12345678000195","65395440000133","65082404000110",
]
resultado = validar_cnpj_cpf_multiplos(numeros)
print( "----------------------EXEMPLO DE USO MULTIPLO--------------------------------")
for r in resultado:
status = "✅ Válido" if r["valido"] else "❌ Inválido"
print(f"{r['numero']} → {r['tipo']} → {status}")
# ============================
# EXEMPLO DE USO INDIVIDUAL
# ============================
entrada = "00087797474508"
resultado = validar_cnpj_cpf_individual(entrada)
status = "✅ Válido" if resultado["valido"] else "❌ Inválido"
print( "----------------------EXEMPLO DE USO INDIVIDUAL--------------------------------")
print(resultado)
print(f"{resultado['numero']} → {resultado['tipo']} → {status}")
@rodrigocorreaecastro
Copy link
Author

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment