web-dev-qa-db-ja.com

Pythonで二重のバックスラッシュを単一のバックスラッシュに置き換える方法は?

紐があります。その文字列には二重のバックスラッシュがあります。 Unicodeのcharコードが正しく解析されるように、二重のバックスラッシュを単一のバックスラッシュに置き換えたいのですが。

(Pdb) p fetched_page
'<p style="text-align:center;" align="center"><strong><span style="font-family:\'Times New Roman\', serif;font-size:115%;">Chapter 0<\\/span><\\/strong><\\/p>\n<p><span style="font-family:\'Times New Roman\', serif;font-size:115%;">Chapter 0 in \\u201cDreaming in Code\\u201d give a brief description of programming in its early years and how and why programmers are still struggling today...'

この文字列の中に、次のようなエスケープされたUnicode文字コードが表示されます。

\\u201c

これを次のように変えたいです。

\u201c

試行1:

fetched_page.replace('\\\\', '\\')

しかし、これは機能しません-4つのバックスラッシュを検索します。

試行2:

fetched_page.replace('\\', '\')

ただし、これにより行末エラーが発生します。

試行3:

fetched_page.decode('string_escape')

しかし、これはテキストに影響を与えませんでした。すべての二重バックスラッシュは二重バックスラッシュのままでした。

25
zzz

あなたが試すことができます codecs.escape_decode、これはエスケープシーケンスをデコードするはずです。

24
schlamar

私はあなたが説明する行動をとっていません:

>>> x = "\\\\\\\\"
>>> print x
\\\\
>>> y = x.replace('\\\\', '\\')
>>> print y
\\

'\\\\'出力では、オンがエスケープされているため、文字列にあるスラッシュの2倍のスラッシュが表示されます。あなたが書いたコードは問題なく動作するはずです。 REPLが値を表示する方法だけを見るのではなく、実際の値をprintingしてみます。

12
Jeremy Banks

Python3:

>>> b'\\u201c'.decode('unicode_escape')
'“'

または

>>> '\\u201c'.encode().decode('unicode_escape')
'“'
6
max5555

Jeremyの回答を拡張すると、'\'は引用符をエスケープするため、\'は不正な文字列であり、文字列が終了しないことが問題です。

5
murgatroid99

少しやり過ぎかもしれませんが...

>>> import re
>>> a = '\\u201c\\u3012'
>>> re.sub(r'\\u[0-9a-fA-F]{4}', lambda x:eval('"' + x.group() + '"'), a)
'“〒'

だから、ええ、最も簡単な解決策はms4pyの答えで、文字列でcodecs.escape_decodeを呼び出して結果(またはescape_decodeがPython 3)。ただし、Python 3では、(バイトオブジェクトではなく)文字列を処理するときにcodecs.unicode_escape_decodeを使用する必要があります)。

3
JAB