34 lines
No EOL
971 B
Python
34 lines
No EOL
971 B
Python
import re
|
|
|
|
|
|
class CPF:
|
|
|
|
@staticmethod
|
|
def is_valid_cpf(data: str) -> bool:
|
|
# Remove caracteres não numéricos
|
|
data = re.sub(r'\D', '', data)
|
|
|
|
# Verifica se tem 11 dígitos
|
|
if len(data) != 11:
|
|
return False
|
|
|
|
# CPFs com todos os dígitos iguais são inválidos
|
|
if data == data[0] * 11:
|
|
return False
|
|
|
|
# Calcula o primeiro e segundo dígitos verificadores
|
|
def calcular_digito(digitos, peso):
|
|
soma = sum(int(a) * b for a, b in zip(digitos, peso))
|
|
resto = soma % 11
|
|
return '0' if resto < 2 else str(11 - resto)
|
|
|
|
# Primeiro dígito verificador
|
|
peso1 = range(10, 1, -1)
|
|
digito1 = calcular_digito(data[:9], peso1)
|
|
|
|
# Segundo dígito verificador
|
|
peso2 = range(11, 1, -1)
|
|
digito2 = calcular_digito(data[:10], peso2)
|
|
|
|
# Verifica se os dígitos batem
|
|
return data[-2:] == digito1 + digito2 |