'\\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).