Cómo Python y el módulo regex manejan las barras invertidas

Mi comprensión actual de la biblioteca de expresiones regulares de python 3.4 de la referencia del idioma no parece coincidir con los resultados de mi experimento del módulo.


Mi actual entendimiento

El motor de expresiones regulares se puede considerar como una entidad separada con su propio lenguaje de progtwigción que entiende (regex). Simplemente sucede que vive dentro de python, entre una variedad de otros idiomas. Como tal, Python debe pasar el patrón / código (regex) a este intérprete independiente, si lo desea.

Por razones de claridad, el siguiente texto utilizará la noción de logical length , que se supone que representa la longitud lógica de la cadena dada. Por ejemplo, el retorno de carro de caracteres especiales tendrá len=1 ya que es un solo carácter. Sin embargo, los 2 caracteres distintos (barra diagonal inversa seguida de una r) tendrán len=2 .

1) Digamos que queremos hacer coincidir un retorno de carro \r len=1 en algún texto

2) Necesitamos alimentar el patrón \r len=2 (2 caracteres distintos) al motor de expresiones regulares

3) El motor de expresiones regulares recibe \r len=2 e interpreta el patrón como: coincide con el retorno de carro de caracteres especiales \r len=1

4) Sigue adelante y hace la magia.

El problema es que el intérprete de Python utiliza el carácter de barra invertida en sí mismo como algo especial: un carácter destinado a escapar de otras cosas (como comillas)

Entonces, cuando estamos codificando en python y necesitamos express la idea de que necesitamos enviar el patrón \r len=2 al intérprete interno de expresiones regulares, debemos escribir pattern = '\\r' o alternativamente pattern = r'\r' para express \r len=2 .


Y todo está bien … hasta

Intento un par de experimentos con re.escape

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí


Resumen de preguntas

1) Por favor confirme / modifique mi comprensión actual del motor de expresiones regulares

2) ¿Por qué estos supuestos patrones de definición no de libros de texto coinciden?

3) ¿Qué diablos está pasando con \\\r desde re.escape , y el conjunto “tenemos las mismas longitudes de cadena, pero comparamos desiguales, pero TAMBIÉN trabajamos igual en un retorno de carro en la re.search anterior? re.search test ”

Debe comprender que cada vez que escribe un patrón, primero se interpreta como una cadena antes de que el motor de expresiones regulares la lea e interprete por segunda vez. Vamos a describir lo que pasa:

 >>> s='\r' 

s contiene el caracter CR.

 >>> re.match('\r', s) <_sre.SRE_Match object; span=(0, 1), match='\r'> 

Aquí, la cadena '\r' es una cadena que contiene CR, por lo que se otorga una CR literal al motor de expresiones regulares.

 >>> re.match('\\r', s) <_sre.SRE_Match object; span=(0, 1), match='\r'> 

La cadena ahora es una barra invertida literal y una r literal, el motor de expresiones regulares recibe estos dos caracteres y, dado que \r es una secuencia de escape de expresiones regulares que significa también un carácter CR, también se obtiene una coincidencia.

 >>> re.match('\\\r', s) <_sre.SRE_Match object; span=(0, 1), match='\r'> 

La cadena contiene una barra invertida literal y una CR literal, el motor de expresiones regulares recibe \ y CR , pero como \CR no es una secuencia de escape conocida de expresiones regulares, la barra diagonal inversa se ignora y se obtiene una coincidencia.

Tenga en cuenta que para el motor de expresiones regulares, una barra invertida literal es la secuencia de escape \\ (por lo tanto, en una cadena de patrón r'\\' o '\\\\' )