222

技術的には、ドキュメンテーションで説明されているように、任意の奇数のバックスラッシュ。

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

パーサーは生の文字列のバックスラッシュを通常の文字として扱うことができるようですが (それが生の文字列のすべてではありませんか?)、おそらく明らかな何かが欠けています。

4

12 に答える 12

148

その理由は、そのセクションの太字で強調した部分で説明されています。

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

そのため、生の文字列は 100% 生ではなく、基本的なバックスラッシュ処理がまだいくつかあります。

于 2009-03-15T13:05:31.097 に答える
28

そういうものだ!Python の小さな欠陥の 1 つだと思います。

正当な理由があるとは思いませんが、解析していないことは間違いありません。最後の文字として \ を使用して生の文字列を解析するのは非常に簡単です。

キャッチは、\ を生の文字列の最後の文字にすることを許可すると、生の文字列の中に " を入れることができないことです。python は \ を最後の文字として許可する代わりに " を許可したようです。

ただし、これで問題が発生することはありません。

のような Windows フォルダー パスを簡単に書き込めないことが心配な場合はc:\mypath\、心配するr"C:\mypath"必要はありません。とにかくそれは正しい方法ではありません!使用するos.path.join

>>> import os
>>> os.path.join(r"C:\mypath", "subfolder")
'C:\\mypath\\subfolder'
于 2009-03-15T13:17:10.117 に答える
23

生の文字列をスラッシュで終了するには、次のトリックを使用することをお勧めします。

>>> print r"c:\test"'\\'
test\
于 2011-04-29T08:57:03.980 に答える
16

もう 1 つのトリックは、chr(92) が "\" に評価されるときに使用することです。

最近、バックスラッシュの文字列をきれいにする必要がありましたが、次のようにしました。

CleanString = DirtyString.replace(chr(92),'')

これは「理由」を考慮していないことを認識していますが、スレッドは、差し迫った問題の解決策を探している多くの人々を引き付けます.

于 2011-11-02T19:54:40.517 に答える
9

\" は生の文字列内で許可されているため、文字列リテラルの末尾を識別するために使用することはできません。

最初の "?

その場合、 \" は文字列リテラル内では許可されません。しかし、そうです。

于 2009-03-15T16:59:09.537 に答える
4

が構文的に正しくない理由r'\'は、文字列式はそのままですが、使用される引用符 (一重または二重) は常にエスケープでなければならないためです。したがって、シングル クォーテーション文字列内でシングル クォーテーションを表現したい場合は、 を使用する以外に方法はありません\'。同じことが二重引用符にも当てはまります。

ただし、次を使用できます。

'\\'
于 2009-03-15T12:59:20.520 に答える
1

その後、回答を削除した別のユーザー (彼らがクレジットされたいかどうかわからない) は、Python 言語の設計者が同じ解析規則を使用し、後付けとしてエスケープ文字を生の形式に拡張することで、パーサーの設計を簡素化できる可能性があることを示唆しました。 (リテラルが raw としてマークされている場合)。

面白いアイデアだと思い、後世のためにコミュニティ wiki として含めています。

于 2009-03-15T14:20:01.667 に答える
0

いくつかのヒント :

1)パスのバックスラッシュを操作する必要がある場合は、標準のPythonモジュールos.pathが最適です。例えば ​​:

os.path.normpath('c:/ folder1 /')

2)バックスラッシュを含む文字列を作成したいが、文字列の最後にバックスラッシュを付けない場合は、生の文字列が友だちです(リテラル文字列の前に「r」プレフィックスを使用してください)。例えば ​​:

r'\one \two \three'

3)変数Xの文字列の前に円記号を付ける必要がある場合は、次のようにすることができます。

X='dummy'
bs=r'\ ' # don't forget the space after backslash or you will get EOL error
X2=bs[0]+X  # X2 now contains \dummy

4)最後に円記号が付いた文字列を作成する必要がある場合は、ヒント2と3を組み合わせます。

voice_name='upper'
lilypond_display=r'\DisplayLilyMusic \ ' # don't forget the space at the end
lilypond_statement=lilypond_display[:-1]+voice_name

今lilypond_statementは含まれています"\DisplayLilyMusic \upper"

長生きするPython!:)

n3on

于 2009-03-15T22:22:05.283 に答える
0

C から来て、単一の \ がエスケープ文字として機能し、改行、タブ、引用符などの特殊文字を文字列に入れることができることは明らかです。

\ は " をエスケープし、パーサーをチョークさせるため、最後の文字として \ を実際に許可しません。しかし、前に指摘したように \ は合法です。

于 2009-03-15T17:14:37.707 に答える