2016-09-28 5 views
4

Windows DNSデバッグログを読み込むプログラムを作成しましたが、内部には常にドメインフィールドに面白い文字があります。以下はPythonはユニコード文字を置き換えます

は例の一つである:

(13)\xc2\xb5\xc2\xb1\xc2\xbe\xc3\xa2p\xc3\xb4\xc2\x8d(5)example(3)com(0)'

私は交換したいすべて私が明示的に入力し?

\x..は\ XC2は作品

line = '(13)\xc2\xb5\xc2\xb1\xc2\xbe\xc3\xa2p\xc3\xb4\xc2\x8d(5)example(3)com(0)' 
re.sub('\\\xc2', '?', line) 
result: '(13)?\xb5?\xb1?\xbe\xc3\xa2p\xc3\xb4?\x8d(5)example(3)com(0)' 

しかし、そのないが、次のように私が次のように書くと働く:

re.sub('\\\x..', '?', line)

どのように正規表現を書いてそれらをすべて置き換えることができますか?

+0

純粋に読者のためのエーザイサイズ - re.sub( '[\ x80- \ xff]'、 '?'、line) '。しかし、しないでください、@ウィムの答えはあなたが行くべきものです。 –

答えて

2

正規表現よりも、この仕事のためのより良いツールがありますが、あなたはたとえば試みることができるが:

>>> line 
'(13)\xc2\xb5\xc2\xb1\xc2\xbe\xc3\xa2p\xc3\xb4\xc2\x8d(5)example(3)com(0)' 
>>> line.decode('ascii', 'ignore') 
u'(13)p(5)example(3)com(0)' 

非ASCII文字をスキップします。代わりに、あなたはそれらを '?'のために入れ替えることができます。プレースホルダ:

>>> print line.decode('ascii', 'replace') 
(13)��������p����(5)example(3)com(0) 

しかし、最善の解決策は、誤ったエンコード/デコードがmojibakeが最初の場所で発生する原因を見つけることですので、あなたは正しいコードページを使用してデータを復旧することができます。

emojibake hereのベーキング解除に関する素晴らしい回答があります。それは不正確な科学であり、重要な情報の多くは実際にその答えの下のコメントスレッドにあります。

-2

この点についてはどうですか?

line = '(13)\xc2\xb5\xc2\xb1\xc2\xbe\xc3\xa2p\xc3\xb4\xc2\x8d(5)example(3)com(0)' 

pattern = r'\\x.+' 
re.sub(pattern, r'?', line) 
+1

これは完全に間違っています。文字列は一連の '\'と 'x'文字の後に英数字の対が続き、' \ xNN'はASCIIの範囲外のバイトの表現です。 Python文字列(あいまいな用語)の '__repr__'はこれらのバイトをキャッチし、その16進値の表現を出力します。 –

+0

いいえ、\ xc2が通常の文字列とみなされないため、これは機能しません。この文字列全体を個体文字の組み合わせとして扱うことはできません。 – kenneth171

+0

いいえ、\ xc2は通常の文字列と見なされないため動作しません。この '文字列'全体を個体文字の組み合わせとして扱うことはできません。私はこれのためにregexの値の範囲を使うことができることがわかりました:re.sub(r '[\ x03] | [\ x8d] | [\ xa0- \ xaf] | [\ xb0- \ xbf] | [\ xc0- \ xcf] | [[xd0- \ xdf] '、' '、行)。しかし、欠点は、この範囲を考え出すために可能な範囲を事前に知る必要があることです。 – kenneth171

関連する問題