2012-06-23 5 views

答えて

10
あなたはまだそうでない場合はPythonインタプリタがないので、生の文字列で 'または "をエスケープする \が必要

文字列がどこで止まるかを知る。あなたの例では、閉鎖'をエスケープしています。それ以外の場合は

:私が何を意味するか確認するためにシンタックスハイライトで

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

ルック。

+0

しかし、文字列の中の\は、\\に変換する代わりに文字列の隣の文字をエスケープする必要があります。 –

+0

@AshwiniChaudhary:いいえ、生の文字列で '\' _only_が引用文字をエスケープします。 – Eric

+0

はい、私は1つの\をコード書式で書くことを許可していません。;) ありがとうございました。 –

3

Pythonの文字列は、2つのステップで処理されます。

  1. まずトークナイザが終了引用符を探します。これは、バックスラッシュを認識しますが、解釈しません。単に文字列要素のシーケンスとそれに続く閉じ引用符を探します。「文字列要素」は、バックスラッシュ、クロージング引用符またはa改行 - 改行は3重引用符で許可されます)、または(バックスラッシュ、任意の1文字)。

  2. 文字列の内容は、文字列の種類によって解釈されます(バックスラッシュエスケープが処理されます)。文字列リテラルの前のフラグrは、このステップにのみ影響します。

+0

これは、Pythonスキャナが 'r'をトークンとして保存した後、baskslashが通常の文字として扱われるルールではなく、* default *文字列処理ルールを使用して文字列をスキャンするように見えます。この問題はhttp://stackoverflow.com/q/30283082/3259619で議論されています。 – CarpetPython

5

生の文字列があるため、パーサがどのように動作するかの単一のバックスラッシュで終わらせることはできません(存在している実際のしかし、起こってエスケープ)しません。

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

きれいではありませんが、それは動作します:この問題を回避するには、その後のリテラル非生の文字列としてバックスラッシュを追加することです。あなたは追加することができますプラス何が起こっているのか、それをより明確にするために、それは必要はありません。

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

https://docs.python.org/3.4/reference/lexical_analysis.html#literalsからの引用:

でも生のリテラルでは、引用符はバックスラッシュでエスケープすることができますが、 バックスラッシュは結果に残ります。 r "\" "は有効な文字列です リテラルはバックスラッシュと二重引用符で構成されます r" \ "は有効な文字列リテラルではありません(生の文字列は 特に、生のリテラルは、 で終わることができません。(バックスラッシュは、次のように の引用符をエスケープするためです)。改行の後に続く という単一のバックスラッシュは、その2文字として解釈されます。リテラル、 は行継続ではありません。"又は'に先行する場合

そこで生の文字列で、バックスラッシュは除いて、特別扱いされていません。したがって、r'\'またはr"\"は有効な文字列ではないため、右引用符がエスケープされ、文字列リテラルが無効になります。この場合、rが存在するかどうかに違いはありません。つまり、r'\''\'に相当し、r"\""\"に相当します。

関連する問題