Porque \
comece as sequências de escape apenas quando forem sequências 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 um prefixo 'r' ou 'R' esteja presente, as sequências de escape em strings são interpretadas de acordo com regras semelhantes às usadas pelo Padrão C. As sequências de escape reconhecidas são:
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 confie em strings brutas para literais de caminho, pois as strings brutas têm alguns funcionamentos internos bastante peculiares , conhecidos por terem mordido as pessoas na bunda:
Quando um prefixo "r" ou "R" está presente, um caractere após uma barra invertida é incluído na string sem alteração e todas as barras invertidas são deixadas na string. Por exemplo, a string literal r"\n"
consiste em dois caracteres: uma barra invertida e um "n" minúsculo. As aspas de string podem ser escapadas com uma barra invertida, mas a barra invertida permanece na string; por exemplo, r"\""
é um literal de string válido que consiste em dois caracteres: uma barra invertida e uma aspa dupla; r"\"
não é um literal de string válido (mesmo uma string bruta não pode terminar com um número ímpar de barras invertidas). Especificamente, uma string bruta não pode terminar em uma única barra invertida (uma vez que a barra invertida escaparia do seguinte caractere de aspas). Observe também que uma única barra invertida seguida por uma nova linha é interpretada como esses dois caracteres como parte da string,
Para ilustrar melhor este último ponto:
>>> 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'
) também é representado como'\\s'
, devido a'\s'
não ser uma sequência de escape reconhecida.