6

私は次のような文字列を持っています:

>>> t
'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'

UnicodeをPythonの代表的なエスケープシーケンスに変換する関数を使って作ったもの。次に、それを元に変換したいときに、二重のバックスラッシュを取り除くことができないため、再びユニコードとして解釈されます。これはどのように行うことができますか?

>>> t = unicode_encode("
>>> t
'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'
>>> print(t)
\u0048\u0065\u006c\u006c\u006f\u0020\u20ac\u0020\u00b0    
>>> t.replace('\\','X')
'Xu0048Xu0065Xu006cXu006cXu006fXu0020Xu20acXu0020Xu00b0'
>>> t.replace('\\', '\\')
'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'

もちろん、これもできません:

>>> t.replace('\\', '\')
  File "<ipython-input-155-b46c447d6c3d>", line 1
    t.replace('\\', '\')
                         ^
SyntaxError: EOL while scanning string literal
4

3 に答える 3

9

これがあなたの状況に適しているかどうかはわかりませんが、次を使用してみてくださいunicode_escape:

>>> t
'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'
>>> type(t)
<class 'str'>
>>> enc_t = t.encode('utf_8')
>>> enc_t
b'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'
>>> type(enc_t)
<class 'bytes'>
>>> dec_t = enc_t.decode('unicode_escape')
>>> type(dec_t)
<class 'str'>
>>> dec_t
'Hello € °'

または省略形で:

>>> t.encode('utf_8').decode('unicode_escape')
'Hello € °'

文字列を取得し、 を使用してエンコードし、 を使用してUTF-8デコードしunicode_escapeます。

于 2013-01-22T07:00:09.010 に答える
0

コードにはバックスラッシュが1つしかありませんが、バックスラッシュはとして表され\\ます。ご覧のとおり、を使用する場合print()、円記号は1つだけです。したがって、2つの円記号のいずれかを削除したい場合は、何もしないでください。そこにはありません。両方を削除したい場合は、1つを削除してください。ここでも\\、1つの円記号を表すために使用します。t.replace("\\", "")

したがって、文字列に最初から2つの円記号が含まれることはなく、問題になることはありません。

于 2013-01-22T07:10:21.360 に答える
0

バックスラッシュはエスケープ文字であり、2 つのバックスラッシュを検索しているため、 4 つのバックスラッシュを2 つ置き換える必要があります。

t.replace("\\\\", "\\")

これにより、すべてが に置き換えr"\\"られr"\"ます。はr生の文字列を示します。したがって、たとえば、print(r"\\")idle または任意の python スクリプト (またはprint r"\\"Python 2) に入力すると、 \\\\. これは、 every"\\"が実際にはただのr"\".

user1632861 は を使用することを提案しました.replace("\\", "")が、これは ever を何も置き換えr"\"ません。代わりに上記の方法を試してください。:D

ただし、この場合、データの読み取り/受信を行っているように見え、おそらく正しいエンコーディングを使用してから、Unicode にデコードする必要があります (上の人が提案したように)。

于 2014-08-05T19:05:47.263 に答える