10

\生の文字列はすべてに変換されます\\が、これ\が最後に表示されるとエラーが発生しますが、ここでは混乱しています。

>>> r'so\m\e \te\xt'
'so\\m\\e \\te\\xt'

>>> r'so\m\e \te\xt\'
SyntaxError: EOL while scanning string literal

アップデート:

これはPythonのFAQでも取り上げられています。生の文字列(r-strings)をバックスラッシュで終わらせることができないのはなぜですか?

4

4 に答える 4

10

\エスケープする'か、生の文字列にする必要があり"ます。そうしないと、Pythonインタープリターは文字列がどこで停止するかを認識しません。あなたの例では、クロージングをエスケープしています'

さもないと:

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

構文の強調表示を見て、私が何を意味するかを確認してください。

于 2012-06-23T08:42:19.047 に答える
9

パーサーがどのように機能するかにより、生の文字列を単一の円記号で終わらせることはできません(ただし、実際のエスケープは行われません)。回避策は、後でバックスラッシュを非生の文字列リテラルとして追加することです。

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

きれいではありませんが、動作します。プラスを追加して、何が起こっているのかを明確にすることができますが、必須ではありません。

>>> print(r'foo' + '\\')
foo\
于 2012-06-23T14:13:50.687 に答える
3

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

  1. 最初に、トークナイザーは終了引用符を探します。これを行うとバックスラッシュを認識しますが、解釈はしません。文字列要素のシーケンスとそれに続く終了引用符を検索します。ここで、「文字列要素」は(バックスラッシュ、終了引用符、または改行-改行はトリプルクォートで許可されている場合を除きます)、または(バックスラッシュの後に任意の1文字が続きます)。

  2. 次に、文字列の種類に応じて、文字列の内容が解釈されます(円記号のエスケープが処理されます)。文字列リテラルの前のrフラグは、このステップにのみ影響します。

于 2012-06-23T12:49:47.920 に答える
2

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

生のリテラルでも、引用符は円記号でエスケープできますが、円記号は結果に残ります。たとえば、r "\" "は、バックスラッシュと二重引用符の2文字で構成される有効な文字列リテラルです 。r" \ "は有効な文字列リテラルではありません(生の文字列でさえ、奇数のバックスラッシュで終了することはできません)。具体的には、生のリテラルを単一のバックスラッシュで終了することはできません(バックスラッシュは次の引用文字をエスケープするため)。また、単一のバックスラッシュとそれに続く新しい行は、行の続きとしてではなく、リテラルの一部としてこれらの2つの文字として解釈されることに注意してください。 。

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

于 2015-05-17T03:51:28.380 に答える