紐があります。その文字列には二重のバックスラッシュがあります。 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')
しかし、これはテキストに影響を与えませんでした。すべての二重バックスラッシュは二重バックスラッシュのままでした。
あなたが試すことができます codecs.escape_decode
、これはエスケープシーケンスをデコードするはずです。
私はあなたが説明する行動をとっていません:
>>> x = "\\\\\\\\"
>>> print x
\\\\
>>> y = x.replace('\\\\', '\\')
>>> print y
\\
'\\\\'
出力では、オンがエスケープされているため、文字列にあるスラッシュの2倍のスラッシュが表示されます。あなたが書いたコードは問題なく動作するはずです。 REPLが値を表示する方法だけを見るのではなく、実際の値をprint
ingしてみます。
Python3:
>>> b'\\u201c'.decode('unicode_escape')
'“'
または
>>> '\\u201c'.encode().decode('unicode_escape')
'“'
Jeremyの回答を拡張すると、'\'
は引用符をエスケープするため、\'
は不正な文字列であり、文字列が終了しないことが問題です。
少しやり過ぎかもしれませんが...
>>> 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
を使用する必要があります)。