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

3 minutos de lectura

me he encontrado con un problema re mó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, en realidad, no encontré la respuesta: ¿qué debo usar en lugar de \d+? Sólo [0-9]+ o tal vez algo más?

  • No debería ser el problema, ¿proporcionar más código?

    – Sara

    24 de mayo de 2018 a las 8:30

  • Doble escape \d o usar r'\\nRevision: (\d+)\\n'?

    – revo

    24 de mayo de 2018 a las 8:33

avatar de usuario
ACascarino

Python 3 interpreta los literales de cadena como cadenas Unicode y, por lo tanto, su \d se trata como un carácter Unicode escapado.

Declare su patrón RegEx como una cadena sin formato en lugar de anteponer rcomo a continuación:

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

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

  • Para ser un poco más preciso, \d se trata como una secuencia de escape no reconocida y, como tal, no se modifica. Se da una advertencia de depreciación 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

    6 de abril de 2019 a las 8:23

  • @VPfB el hilo es antiguo, pero estaba buscando respuestas sobre el mismo problema. Si \d se trata como un carácter Unicode escapado, ¿cómo distingo d (carácter alfabético) de \d (cualquier dígito) sin tratar el patrón de expresión regular como una cadena sin formato? (La misma pregunta se aplica a \w, \W etc…)

    – giulia_dnt

    21 de enero de 2020 a las 16:15

  • @theggg Si entiendo su pregunta correctamente, escape su barra invertida, para que la cadena se lea '\\d'.

    – ACascarino

    21 de enero de 2020 a las 18:10

  • Esto también se aplica para \s y otros personajes escapados

    – A.H.

    26 de abril de 2021 a las 9:15

avatar de usuario
maxschlepzig

Recibe una advertencia de depreciación para

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

porque Python interpreta \d como secuencia de escape no válida. Tal como está, Python no sustituye esa subcadena, pero advierte al respecto desde la versión 3.6:

A diferencia del Estándar C, todas las secuencias de escape no reconocidas se dejan en la cadena sin cambios, es decir, la barra invertida se deja en el resultado. (Este comportamiento es útil durante la depuración: si una secuencia de escape está mal escrita, la salida resultante se reconoce más fácilmente como rota). También es importante tener en cuenta que las secuencias de escape solo reconocidas en cadenas literales entran en la categoría de escapes no reconocidos para bytes literales.

Cambiado en la versión 3.6: Las secuencias de escape no reconocidas generan una advertencia de desaprobación. En una versión futura de Python, serán un SyntaxWarning y eventualmente un SyntaxError.

(fuente)


Por lo tanto, puede corregir esta advertencia ya sea escapando de esa barra invertida correctamente o usando cadenas sin formato.

Eso significa, escapar más:

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

O utilice un literal de cadena sin procesar (donde \ no inicia una secuencia de escape):

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad