なぜなら\
彼らは、有効なエスケープシーケンスの場合のみエスケープシーケンスを開始します。
>>> '\n'
'\n'
>>> r'\n'
'\\n'
>>> print '\n'
>>> print r'\n'
\n
>>> '\s'
'\\s'
>>> r'\s'
'\\s'
>>> print '\s'
\s
>>> print r'\s'
\s
'r'または 'R'プレフィックスが存在しない限り、文字列内のエスケープシーケンスは、標準Cで使用されているものと同様のルールに従って解釈されます。認識されるエスケープシーケンスは次のとおりです。
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
パスリテラルを生の文字列に依存しないでください。生の文字列には、お尻に噛まれた人がいることが知られている、かなり独特な内部動作があります。
「r」または「R」プレフィックスが存在する場合、バックスラッシュに続く文字は変更されずに文字列に含まれ、すべてのバックスラッシュは文字列に残されます。たとえば、文字列リテラルr"\n"
は、円記号と小文字の「n」の2文字で構成されます。文字列の引用符はバックスラッシュでエスケープできますが、バックスラッシュは文字列に残ります。たとえば、r"\""
バックスラッシュと二重引用符の2文字で構成される有効な文字列リテラルです。r"\"
は有効な文字列リテラルではありません(生の文字列でさえ奇数の円記号で終了することはできません)。具体的には、生の文字列を単一の円記号で終了することはできません(円記号は次の引用文字をエスケープするため)。また、1つの円記号とそれに続く改行は、文字列の一部としてこれら2つの文字として解釈されることにも注意してください。
この最後の点をよりよく説明するために:
>>> 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'
(のようなr'\s'
)も、認識されたエスケープシーケンスではない'\\s'
ため、として表され'\s'
ます。