Aviso de descontinuação: sequência de escape inválida - o que usar em vez de \ d?

106

Encontrei um problema com o remódulo em Python 3.6.5. Eu tenho este padrão em minha expressão regular:

'\\nRevision: (\d+)\\n'

Mas quando o executo, recebo um DeprecationWarning.

Procurei o problema no SO e não encontrei a resposta, na verdade - o que devo usar no lugar \d+? Apenas [0-9]+ou talvez outra coisa?

mchfrnc
fonte
2
Não deveria ser o problema, fornecer mais código?
Sraw
3
Escape duplo \dou uso r'\\nRevision: (\d+)\\n'?
revo

Respostas:

176

Python 3 interpreta literais de string como strings Unicode e, portanto, seu \dé tratado como um caractere Unicode de escape.

Declare seu padrão RegEx como uma string bruta em vez de prefixá-lo r, conforme abaixo:

r'\nRevision: (\d+)\n'

Isso também significa que você também pode descartar os escapes de \n, pois eles serão analisados ​​como caracteres de nova linha por re.

ACascarino
fonte
8
Para ser um pouco mais preciso, \dé tratado como uma sequência de escape não reconhecida e, como tal, não é alterado. Um aviso de depreciação é fornecido desde o Python 3.6. Em alguma versão futura do Python, será um SyntaxError. Detalhes de "2.4.1. Literais de string e bytes" no Docs.
VPfB de
@VPfB o tópico é antigo, mas eu estava procurando respostas para o mesmo problema. Se \ d for tratado como um caractere Unicode de escape, como faço para distinguir d (caractere alfabético) de \ d (qualquer dígito) sem tratar o padrão regex como string bruta? (A mesma pergunta se aplica a \ w, \ W etc ...)
giulia_dnt
2
@theggg Se eu entendi sua pergunta corretamente - escape da barra invertida, para que a string seja lida '\\d'.
ACascarino