46

私はひもを持っています。その文字列には二重のバックスラッシュがあります。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')

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

4

6 に答える 6

26

を試すことができcodecs.escape_decodeます。これにより、エスケープ シーケンスがデコードされます。

于 2011-07-19T19:06:59.457 に答える
15

あなたが説明した動作が得られません:

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

出力を見る'\\\\'と、各 on がエスケープされているため、文字列内の 2 倍の数のスラッシュが表示されています。あなたが書いたコードはうまくいくはずです。printREPL がどのように値を表示するかを見るだけでなく、実際の値を試してみてください。

于 2011-07-19T18:53:10.563 に答える
5

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

于 2011-07-19T19:00:08.227 に答える
3

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

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

つまり、最も単純な解決策は、ms4pyの答えであり、文字列を呼び出して結果を取得します(または、 Python 3のようにタプルを返すcodecs.escape_decode場合は、結果の最初の要素)。escape_decodeただし、Python 3ではcodecs.unicode_escape_decode、(バイトオブジェクトではなく)文字列を操作するときに使用する必要があります。

于 2011-07-19T19:17:24.657 に答える