A função
Python
import re
def is_valid_cpf(cpf: str) -> bool:
cpf = re.sub(r'\D', '', cpf) # mantém só dígitos
if len(cpf) != 11 or cpf == cpf[0] * 11: # 11 dígitos, não repetidos
return False
for i in (9, 10): # confere os dois DV
soma = sum(int(cpf[j]) * ((i + 1) - j) for j in range(i))
if (soma * 10 % 11) % 10 != int(cpf[i]):
return False
return True
is_valid_cpf('111.444.777-35') # True
is_valid_cpf('111.444.777-00') # FalseO cálculo é o do módulo 11: cada dígito da base é multiplicado por um peso decrescente. O truque (soma * 10 % 11) % 10 resolve o verificador e ainda transforma o resto 10 em 0, sem um if à parte.
Com máscara na saída
Se você precisa exibir o CPF pontuado, formate só na apresentação — guarde sempre os 11 dígitos limpos:
Python
def format_cpf(cpf: str) -> str:
d = re.sub(r'\D', '', cpf)
return f'{d[0:3]}.{d[3:6]}.{d[6:9]}-{d[9:11]}'
format_cpf('11144477735') # '111.444.777-35'publicidade
Cuidados
- Regex só valida formato. Um padrão como
^\d{11}$confirma que são 11 dígitos, mas não confere o verificador — quem faz isso é a função acima. Veja regex de CPF. - Sequências repetidas (
11111111111) passariam no módulo 11, por isso a função as descarta antes. - Válido ≠ existe. A função confirma a consistência matemática, não se o CPF foi emitido a alguém.
- Guarde sem máscara (só os 11 dígitos) e formate só na exibição.
Continue
Código verificado por execução (casos válidos e inválidos). Algoritmo módulo 11 oficial. Revisado em 06/2026.