DeprecationWarning: secuencia de escape no válida: ¿qué usar en lugar de \ d?

106

Me encontré con un problema con el remódulo en Python 3.6.5. Tengo este patrón en mi expresión regular:

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

Pero cuando lo ejecuto, obtengo un DeprecationWarning.

Busqué el problema en SO y no he encontrado la respuesta, en realidad, ¿qué debo usar en lugar de \d+? ¿Solo [0-9]+o quizás algo más?

mchfrnc
fuente
2
No debería ser el problema, ¿proporcionar más código?
Sraw
3
¿Doble escape \do uso r'\\nRevision: (\d+)\\n'?
revo

Respuestas:

176

Python 3 interpreta los literales de cadena como cadenas Unicode y, por lo tanto, \dse trata como un carácter Unicode de escape.

Declare su patrón de expresión regular como una cadena sin procesar en lugar de anteponer r, como se muestra a continuación:

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

Esto también significa que también puede descartar los escapes \n, ya que estos solo serán analizados como caracteres de nueva línea por re.

ACascarino
fuente
8
Para ser un poco más precisos, \dse trata como una secuencia de escape no reconocida y, como tal, no se modifica. Se da una DeprecationWarning desde Python 3.6. En alguna versión futura de Python será un SyntaxError. Detalles de "2.4.1. Literales de cadena y bytes" en Docs.
VPfB
@VPfB el hilo es antiguo, pero estaba buscando respuestas sobre el mismo problema. Si \ d se trata como un carácter Unicode de escape, ¿cómo distingo d (carácter alfabético) de \ d (cualquier dígito) sin tratar el patrón de expresiones regulares como una cadena sin formato? (La misma pregunta se aplica a \ w, \ W, etc.)
giulia_dnt
2
@theggg Si entiendo correctamente su pregunta, evite la barra invertida, para que la cadena se lea '\\d'.
ACascarino