2017-01-30 17 views
-1

ウェブサイトのソースコードをダウンロードしました。ソースコードをダウンロードして文字列に変換すると、一重引用符( ')、二重引用符( ")、角カッコ(<、>)、およびスラッシュ(/)などの多くの文字が二重にエスケープされます。Python - エスケープされた4桁のエスケープされたユニコード文字

例:

s = '\\u2018this \\/ that\\u2019' 

ウェブサイトで示されたテキスト、と私はプリントアウトしたときに、それを表現する方法は次のとおりです。

this/that

私の最初の本能を見つけるために正規表現を使用していましたすべての2つのバックスラッシュのスタンス、および4桁を変換するstr.encode('utf-8').decode('utf-8')を使用し、その後、単一のバックスラッシュに置き換えるには、彼らの実際の文字にUnicode文字をエスケープ:

import re 
sample = '\\u2018this \\/ that\\u2019' 
pattern = r'(\\)\\\1' 
double_escapes_removed = re.sub(pattern, '', text) 
final_text = text.encode('utf-8').decode('utf-8') 

print(final_text)this/thatを返す必要がありますが、返される文字列は完全に変更されていないように見えます:\u2018this \/ that\u2019

私はre.findall(pattern, text)でパターンを個別にテストし、3つの二重バックスラッシュのインスタンスが見つかりました。それを超えて、何が間違っているのか分かりません。

答えて

1

これはちょっと難しいことが分かります。問題の大きな部分は、 '\ u2018'は6文字ですが '\ u2018'は1文字の表現であるため、 '\ u'を '\ u'に置き換えて動作させることはできません。

これは、手動で正規表現でエスケープを反復処理することなく、あなたが道のほとんどを取得します。

>>> s.encode('ascii').decode('unicode-escape') 
<<< '‘this \\/ that’' 

のPython 3を約'\/'が無効なUnicodeエスケープシーケンスで警告出力を行いますので、あなたはおそらくしたいと思いますそれらを最初に世話してください。

+0

私の時間を保存していただきありがとうございます –