Python の生の文字列リテラルの予期しない動作
Python の生の文字列リテラルを操作しているときに、生の文字列リテラルを終了しようとすると、特有の問題が発生します。バックスラッシュが 1 つ含まれる文字列の場合、「SyntaxError: EOL while scaning string」が発生します文字通り。」この動作を理解するには、Python の解析メカニズムをさらに深く理解する必要があります。
パーサーの役割
技術的には、生の文字列リテラルでは任意の奇数のバックスラッシュが許可されます。ただし、パーサーによる生の文字列内のバックスラッシュの処理は、この問題を理解するために非常に重要です。
生の文字列は「生」ではありません
一般的な想定に反して、バックスラッシュは生の文字列は、単に通常の文字を表すわけではありません。代わりに、Python のドキュメントには、生の文字列内のバックスラッシュに続く文字は「変更せずに」含まれると明示的に記載されています。これは、各バックスラッシュが後続の文字を「消費」し、バックスラッシュがエスケープされるのではなく一連の文字が生成されることを意味します。
奇数のバックスラッシュ
これを念頭に置くと、 「r'abc'」の例を考えてみましょう。バックスラッシュは次の一重引用符文字を使用するため、Python はこれを「abc'」として解釈します。したがって、生の文字列の末尾にバックスラッシュを 1 つ付けると、文字列が閉じられないままになります。
構文への影響
この動作は、構文分析に大きな影響を与えます。生の文字列の終わりの引用符に遭遇すると、パーサーはそれが文字列を終了することを期待します。ただし、終了引用符の直前にバックスラッシュが 1 つある場合、パーサーはそれを生の文字列の一部として解釈し、文字列は閉じないままにしておきます。この矛盾により、構文エラーが発生します。
パラメトリック動作
次の表は、さまざまな数の端子を使用した生の文字列の動作をまとめたものです。バックスラッシュ:
Terminal Backslashes | Interpretation |
---|---|
None | Raw string ends normally |
Even | Raw string ends normally |
Odd | Syntax error due to unclosed string |
結論
直観に反しているように思えるかもしれませんが、パーサーがバックスラッシュを非バックスラッシュとして扱うため、Python の生の文字列リテラルは単一のバックスラッシュで終わることができません。生の文字列内の文字をエスケープします。この独特の動作により、文字列表現の整合性と構文分析の精度が保証されます。
以上がPython の生の文字列リテラルの末尾にある 1 つのバックスラッシュが SyntaxError を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。