Last active
October 9, 2025 16:15
-
-
Save rodrigocorreaecastro/9c77e679cac0d3a25d28dd9b09cac965 to your computer and use it in GitHub Desktop.
Validador de CNPJ ou CPF, ajusta a mascara conforme o tipo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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}") |
Author
rodrigocorreaecastro
commented
Oct 9, 2025
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment