2011-10-28 10 views
2

Python文字列(およびさまざまなエンコーディングのPythonでのバックスラッシュ認識)でバックスラッシュをエスケープし、正規表現でバックスラッシュを使用しても問題を解決できないという問題については、 。私は非常に任意のヘルプ(リンク、コードの例など)をいただければ幸いです。Python:特定のUnicodeエンティティを辞書からのエンティティに置き換える

を使用して、文字列の16進コードを辞書の特定の要素に置き換えようとしています。コードはタイプ'\ uhhhh'であり、hhhhは16進数です。

私はsqlite3テーブルから文字列を選択します。デフォルトでは、ユニコードとして読み込まれ、「生の」ユニコード文字列として読み込まれるわけではありません。

import re 
pattern_xml = re.compile(r""" 
(.*?)      
([\\]u[0-9a-fA-F]{4}) 
(.*?)       
""", re.VERBOSE | re.IGNORECASE | re.DOTALL) 
uni_code=['201C','201D'] 
decoded=['"','"'] 
def repl_xml(m): 
    item=m.group(2) 
    try: decodeditem=decoded[uni_code.index(item.lstrip('\u').upper())] 
    except: decodeditem=item 
    return m.group(1) + "".join(decodeditem) + m.group(3) 

#input   
text = u'Try \u201cquotated text should be here\u201d try' 
#text after replacement 
decoded_text=pattern_xml.subn(repl_xml,text)[0] 
#desired outcome 
desired_text=u'Try "quotated text should be here" try' 

したがって、_decoded_text_を_desired_text_と等しくします。

私は、単一のバックスラッシュを二重バックスラッシュに置き換えたり、テキストを生のUnicode文字列として扱うようにPythonを強制することはできませんでした(バックスラッシュは文字通り扱われ、エスケープ文字とは異なります)。私はre.escape(テキスト)を使ってre.UNICODEを設定しようとしましたが、私の場合は助けになりません。
私はPython 2.7.2を使用しています。

この問題の解決方法はありますか。

編集:行うには何かが

text.encode('unicode_escape') 

あります:私は実際に入力に次のエンコーディングを適用することによって、StandardEncodingsPythonUnicodeIntegrationにこの問題に対する可能な解決策を見出した

+0

[\\] U [0-9A-FA-F] {4} = [\\] U [0-9A-FA-F] { 0,4} – FailedDev

+0

申し訳ありませんが、カンマはそこにあるべきではありません:[\\] u [0-9a-fA-F] {4} – npobedina

+0

入力文字列でエラーを再現する最小限のコードと希望の出力? – FailedDev

答えて

0

サンプルテキストにバックスラッシュは含まれていません。正規表現が本当にここに必要とされていない

>>> text = u'Try \u201cquotated text should be here\u201d try' 
>>> '\\' in text 
False 
>>> print text 
Try “quotated text should be here” try 

\u201cは、Unicode文字を表現するだけの方法です。所望に応じて単に目標Unicode文字を変換:

>>> table = {0x201c: u'"', 0x201d: u'"'} 
>>> text.translate(table) 
u'Try "quotated text should be here" try' 
+0

ありがとう!それは私が必要とするものを正確に行います。私はちょうど正規表現に夢中になり、他のことは考えられませんでした=) – npobedina

関連する問題