【问题标题】:Remove all hex characters from string in Python从Python中的字符串中删除所有十六进制字符
【发布时间】:2016-08-04 12:48:21
【问题描述】:

虽然有类似的问题,但我似乎无法为我的案例找到可行的解决方案:

我在字符串中遇到了一些烦人的十六进制字符,例如

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

我需要删除这些十六进制 \xHH 字符,并单独删除它们,以获得以下结果:

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

解码没有帮助:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: python python-2.7 utf-8 character-encoding string-parsing


    【解决方案1】:

    只需删除所有非 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'
    

    选择你最喜欢的。

    【讨论】:

    • 我选第一个 :)
    【解决方案2】:

    这些不是“十六进制字符”,而是 unicode 字符 'LEFT DOUBLE QUOTATION MARK' ('"') 和 'RIGHT双引号' ('"')。

    >>> 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'
    

    【讨论】:

    • AttributeError: 'str' 对象没有属性 'decode'
    • @pyd:问题被标记为 python 2.7 和 str 在 python 2.7 中有一个 decode 方法 - 它在 python 3 中消失了(显然因为 py3 字符串是 unicode 所以 decode方法没有意义 - 但它仍然存在于 py3 字节字符串(类型 byte)上。
    【解决方案3】:

    您可以让它检查有效的字母,而不是输入所有内容,可以使用string 模块。可能对您有用的是string.ascii_letters(包含string.ascii_lowercasestring.ascii_uppercase)、string.digitsstring.printablestring.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)
    

    【讨论】:

      【解决方案4】:

      你可以像这样在编码后使用解码

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

      【讨论】:

        猜你喜欢
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-10
        • 2018-01-02
        • 1970-01-01
        相关资源
        最近更新 更多