2012-06-23 14 views

Respuesta

10

Todavía es necesario \ escapar ' o " en las cadenas primas, ya que de lo contrario el intérprete de Python no lo hace saber dónde se detiene la cuerda En su ejemplo, está escapando del cierre '.

lo contrario:

r'it wouldn\'t be possible to store this string' 
r'since it'd produce a syntax error without the escape' 

Mira el resaltado de sintaxis para ver a qué me refiero.

+0

pero la \ dentro de la cadena también debe escapar del carácter junto a ellos, en su lugar, simplemente se convierten en \\. –

+0

@AshwiniChaudhary: No, en una cadena sin formato, un '\' _only_ escapa de un carácter de cita. – Eric

+0

sí, SO no me permite escribir un solo formato de código \;) Gracias entendí el punto. –

3

cadenas de Python se procesan en dos pasos:

  1. Primero el tokenizer busca la cotización de cierre. Reconoce las barras diagonales inversas cuando hace esto, pero no las interpreta, solo busca una secuencia de elementos de cadena seguidos de la comilla de cierre, donde los "elementos de cadena" son (un carácter que no es una barra invertida, una comilla de cierre o una nueva línea - excepto las nuevas líneas están permitidas en comillas triples), o (una barra diagonal inversa, seguida de un solo carácter).

  2. Luego se interpretan los contenidos de la cadena (se procesan los escapes de la barra invertida) dependiendo de qué tipo de cadena sea. El indicador r antes de una cadena literal solo afecta este paso.

+0

Parece que el escáner de Python almacena la 'r' como un token, luego continúa escaneando la cadena usando las reglas de procesamiento de cadena * default *, en lugar de reglas donde una baskslash se trata como un carácter ordinario. Este problema se trata en http://stackoverflow.com/q/30283082/3259619. – CarpetPython

5

cuerdas primas no pueden terminar en una barra invertidas debido a cómo funciona el programa de análisis (no hay real de escapar pasando, sin embargo). La solución consiste en añadir a la barra invertida como una cadena literal no prima después:

>>> print(r'foo\') 
    File "<stdin>", line 1 
    print(r'foo\') 
       ^
SyntaxError: EOL while scanning string literal 
>>> print(r'foo''\\') 
foo\ 

No es bonita, pero funciona. Se pueden añadir más para hacerlo más claro lo que está sucediendo, pero no es necesario:

>>> print(r'foo' + '\\') 
foo\ 
1

Presupuesto de https://docs.python.org/3.4/reference/lexical_analysis.html#literals:

Incluso en un literal en bruto, cotizaciones se pueden escapar con una barra invertida, pero la backslash permanece en el resultado; por ejemplo, r "\" "es una cadena válida literal que consta de dos caracteres: una barra invertida y una comilla doble; r" \ "no es una cadena literal válida (incluso una cadena en bruto no puede terminar en impar) número de barras invertidas). Específicamente, un literal sin formato no puede terminar en una sola barra diagonal inversa (ya que la barra inversa escapó del siguiente carácter de comillas ). Tenga en cuenta también que una sola barra invertida seguida de una nueva línea se interpreta como esos dos caracteres como parte de el literal, , no como una continuación de línea.

Así que en cadena de texto, la barra invertida no son tratados de manera especial, a excepción cuando precede " o '. Por lo tanto, r'\' o r"\" no es una cadena válida porque la comilla derecha se escapó, lo que hace que la cadena literal sea inválida. En tal caso, no hay diferencia si existe r, es decir, r'\' es equivalente a '\' y r"\" es equivalente a "\".

Cuestiones relacionadas