Executando verificação de segurança...
Respondendo a [Não disponível] dentro da publicação [Não disponível]
1

'\\d{3}.?\\d{3}.?\\d{3}-?\\d{2}'

Se me permite uma correção: o ponto é um caractere especial em regex, que significa "qualquer caractere" (exceto quebras de linha, a menos que vc use a flag re.DOTALL).

Ou seja, ele vai considerar qualquer caractere entre os números (exceto antes dos dois últimos, pois ali só pode ter hífen):

import re

r = re.compile('\\d{3}.?\\d{3}.?\\d{3}-?\\d{2}', re.ASCII)

# entre os números pode ter qualquer coisa, pois o ponto significa "qualquer caractere"
# só no último caso que pode ser um hífen, mas nos demais, pode qualquer coisa
print(r.findall('''
esse pega: 123456789012
esse também: 123-456-789-00
e esse também: 123X456%789-00
e mais esse: 123通456💩789-00
'''))

# ['123456789012', '123-456-789-00', '123X456%789-00', '123通456💩789-00']

Então se quer apenas o caractere ., precisa escapá-lo com barra invertida também:

r = re.compile('\\d{3}\\.?\\d{3}\\.?\\d{3}-?\\d{2}', re.ASCII)
#                     ^^        ^^

Mas aí eu sugiro usar raw strings, pois assim vc não precisa escapar as barras. Daí a regex acima ficaria:

r = re.compile(r'\d{3}\.?\d{3}\.?\d{3}-?\d{2}', re.ASCII)

O prefixo r antes das aspas de abertura indica que é uma raw string, e as barras invertidas são interpretadas literalmente, sem precisar de escape.


Além do ponto, existem outros caracteres que também precisam de escape (como os parênteses, colchetes e chaves, além do +, * e ?, entre outros). Veja a lista completa aqui.

Para não precisar ficar tratando tudo manualmente, você pode usar re.escape. Ex:

import re
print(re.escape('.[]()')) # \.\[\]\(\)

Quanto a zero_ou_um, ele também é chamado de "opcional" (mas aí vc vê qual nome acha melhor).

Carregando publicação patrocinada...