import re

# quando o CPF é válido, ambas funcionam
cpf = '123.456.789-11'
print(re.match(r'\d{3}\.\d{3}\.\d{3}-\d{2}', cpf)) # encontra match
print(re.match(r'^\d{3}\.\d{3}\.\d{3}-\d{2}$', cpf)) # encontra match

# mas quando tem mais de 2 dígitos no final, a primeira encontra match (mas não deveria)
cpf = '123.456.789-111111111'
print(re.match(r'\d{3}\.\d{3}\.\d{3}-\d{2}', cpf)) # encontra match (mas não deveria)
print(re.match(r'^\d{3}\.\d{3}\.\d{3}-\d{2}$', cpf)) # None (OK, não é um CPF)