Porque \
comienzan las secuencias de escape solo cuando son secuencias de escape válidas.
>>> '\n'
'\n'
>>> r'\n'
'\\n'
>>> print '\n'
>>> print r'\n'
\n
>>> '\s'
'\\s'
>>> r'\s'
'\\s'
>>> print '\s'
\s
>>> print r'\s'
\s
A menos que esté presente un prefijo 'r' o 'R', las secuencias de escape en cadenas se interpretan de acuerdo con reglas similares a las utilizadas por el Estándar C. Las secuencias de escape reconocidas son:
Escape Sequence Meaning Notes
\newline Ignored
\\ Backslash (\)
\' Single quote (')
\" Double quote (")
\a ASCII Bell (BEL)
\b ASCII Backspace (BS)
\f ASCII Formfeed (FF)
\n ASCII Linefeed (LF)
\N{name} Character named name in the Unicode database (Unicode only)
\r ASCII Carriage Return (CR)
\t ASCII Horizontal Tab (TAB)
\uxxxx Character with 16-bit hex value xxxx (Unicode only)
\Uxxxxxxxx Character with 32-bit hex value xxxxxxxx (Unicode only)
\v ASCII Vertical Tab (VT)
\ooo Character with octal value ooo
\xhh Character with hex value hh
Nunca confíe en cadenas sin procesar para los literales de ruta, ya que las cadenas sin procesar tienen un funcionamiento interno bastante peculiar , que se sabe que ha mordido a la gente en el trasero:
Cuando hay un prefijo "r" o "R", un carácter que sigue a una barra invertida se incluye en la cadena sin cambios, y todas las barras invertidas se dejan en la cadena. Por ejemplo, la cadena literal r"\n"
consta de dos caracteres: una barra invertida y una "n" minúscula. Las comillas de cadena se pueden escapar con una barra invertida, pero la barra invertida permanece en la cadena; por ejemplo, r"\""
es un literal de cadena válido que consta de dos caracteres: una barra invertida y una comilla doble; r"\"
no es un literal de cadena válido (incluso una cadena sin formato no puede terminar en un número impar de barras invertidas). Específicamente, una cadena sin formato no puede terminar en una sola barra invertida (ya que la barra invertida escaparía 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 la cadena,
Para ilustrar mejor este último punto:
>>> r'\'
SyntaxError: EOL while scanning string literal
>>> r'\''
"\\'"
>>> '\'
SyntaxError: EOL while scanning string literal
>>> '\''
"'"
>>>
>>> r'\\'
'\\\\'
>>> '\\'
'\\'
>>> print r'\\'
\\
>>> print r'\'
SyntaxError: EOL while scanning string literal
>>> print '\\'
\
'\s'
(liker'\s'
) también se representa como'\\s'
, debido a que'\s'
no es una secuencia de escape reconocida.