web-dev-qa-db-ja.com

文字列内のすべての引用符をエスケープされた引用符で置き換えますか?

次のようなPythonの文字列を指定します。

_s = 'This sentence has some "quotes" in it\n'
_

引用符をエスケープして、その文字列の新しいコピーを作成したい(Javascriptでさらに使用するため)。だから、例えば、私が欲しいのはこれを作ることです:

_'This sentence has some \"quotes\" in it\n'
_

次のようなreplace()を使用してみました。

_s.replace('"', '\"')
_

しかし、それは同じ文字列を返します。それで私はこれを試しました:

_s.replace('"', '\\"')
_

ただし、次のような二重引用符が返されます。

_'This sentence has some \\"quotes\\" in it.\n'
_

_"_を_\"_に置き換える方法は?

更新:

このコピー可能なテキストからの出力として、引用符と改行の両方をエスケープして表示する必要があります。言い換えれば、私はコピーできるようにしたい:

_'This sentence has some \"quotes\" in it.\n'
_

生の文字列とprintの結果を使用すると、正しくエスケープされた引用符が表示されますが、エスケープされた改行は出力されません。 printを使用しない場合、改行を取得しますが、引用符は二重エスケープされます。改行と引用符の両方をエスケープして表示するコピー可能な文字列を作成するにはどうすればよいですか?

31
mix

こんにちは、通常、Javascriptを使用するときは、Pythonが提供するjsonモジュールを使用します。 user2357112が指摘しているように、文字列だけでなく他の多くのものもエスケープします。

import json
string = 'This sentence has some "quotes" in it\n'
json.dumps(string) #gives you '"This sentence has some \\"quotes\\" in it\\n"'
33
Yussuf S

2回目の試みは正しいですが、文字列のreprstrの違いに混乱しています。 2番目の方法を行うより慣用的な方法は、「生の文字列」を使用することです。

_>>> s = 'This sentence has some "quotes" in it\n'
>>> print s
This sentence has some "quotes" in it

>>> print s.replace('"', r'\"')  # raw string used here
This sentence has some \"quotes\" in it

>>> s.replace('"', r'\"')
'This sentence has some \\"quotes\\" in it\n'
_

生の文字列はWYSIWYGです。生の文字列のバックスラッシュは単なる別の文字です。それは-あなたが発見したように-そうでなければ混乱しやすいです;-)

文字列(上記の最後から2番目の出力)を印刷すると、必要な文字が含まれていることがわかります。

print(上記の最後の出力)がない場合、Python値を表示する前に暗黙的にrepr()を適用します。結果は元の値を生成する文字列ですif Pythonはそれを評価しました。それが最後の行でバックラッシが2倍になっている理由です。それらは文字列にはありませんが、if Python =それを評価すると、各_\\_は結果で1つの_\_になります。

21
Tim Peters

あなたの最後の試みはあなたが期待した通りに働いていました。表示される二重のバックスラッシュは、実際に文字列内にある単一のバックスラッシュを表示する方法です。 len()で結果の長さをチェックすることでこれを確認できます。

二重バックスラッシュの詳細については、以下を参照してください: __repr__()


更新:

編集した質問に答えて、これらのいずれかについてはどうですか?

print repr(s).replace('"', '\\"')
print s.encode('string-escape').replace('"', '\\"')

またはpython 3:

print(s.encode('unicode-escape').replace(b'"', b'\\"'))
5
ʇsәɹoɈ