web-dev-qa-db-ja.com

Pythonの文字列からすべての16進文字を削除します

同様の質問がありますが、私の場合に有効な解決策が見つからないようです。

文字列でいくつかの迷惑な16進文字に遭遇しました。

'\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah'

私が必要なのは、これらの16進数を削除することです\xHH文字、およびそれらだけで、次の結果を取得します。

'http://www.google.com blah blah#%#@$^blah'

デコードは助けにはなりません:

s.decode('utf8') # u'\u201chttp://www.google.com\u201d blah blah#%#@$^blah'

どうすればそれを達成できますか?

10
Kludge

非ASCII文字をすべて削除するだけです。

>>> s.decode('utf8').encode('ascii', errors='ignore')
'http://www.google.com blah blah#%#@$^blah'

その他の可能な解決策:

>>> import string
>>> s = '\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah'
>>> printable = set(string.printable)
>>> filter(lambda x: x in printable, s)
'http://www.google.com blah blah#%#@$^blah'

または正規表現を使用します。

>>> import re
>>> re.sub(r'[^\x00-\x7f]',r'', s) 
'http://www.google.com blah blah#%#@$^blah'

好きなものを選んでください。

21
Magnun Leno

これらは「16進文字」ではなく、Unicode文字「LEFT DOUBLE QUOTATION MARK」(「」」および「RIGHT DOUBLE QUOTATION MARK」の内部表現(最初のケースではutf-8エンコードされ、2番目のケースではUnicodeコードポイント)です。 '(' "')。

_>>> s = "\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah"
>>> print s
“http://www.google.com” blah blah#%#@$^blah
>>> s.decode("utf-8")
u'\u201chttp://www.google.com\u201d blah blah#%#@$^blah'
>>> print s.decode("utf-8")
“http://www.google.com” blah blah#%#@$^blah
_

それらを削除する方法としては、それらは通常の文字なので、単純なstr.replace()で実行できます。

_>>> s.replace("\xe2\x80\x9c", "").replace("\xe2\x80\x9d", "")
'http://www.google.com blah blah#%#@$^blah'
_

ASCII以外のすべての文字を一度に削除する場合は、Unicodeにデコードしてから、「ignore」パラメータを使用してASCIIにエンコードするだけです。

_>>> s.decode("utf-8").encode("ascii", "ignore")
'http://www.google.com blah blah#%#@$^blah'
_
6

あなたはそれが有効な文字をチェックするようにさせることができ、すべてをタイプアウトする代わりに、stringモジュールを使用することが可能です。あなたに役立つかもしれないものはstring.ascii_letters(両方を含むstring.ascii_lowercaseおよびstring.ascii_uppercase)、string.digitsstring.printableおよびstring.punctuation

string.printable最初に、しかし、それが少数のあまりにも多くの文字を通過させる場合は、他の文字の組み合わせを使用することができます。

これが私がそれをどのように行うかの例です:

import string
valid_characters = string.printable
start_string = '\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah'
end_string = ''.join(i for i in start_string if i in valid_characters)
3
Peter

このようにエンコードした後にデコードを使用できます

s.encode('ascii', errors='ignore').decode("utf-8")
0
Manthan Koolwal