代码之家  ›  专栏  ›  技术社区  ›  prosseek

用python查找和替换非ascii字符的正则表达式

  •  3
  • prosseek  · 技术社区  · 14 年前

    我需要将一些非ASCII字符改为“uu”。 例如,

    Tannh‰user -> Tannh_user
    
    • 如果我在python中使用正则表达式,我该怎么做呢?
    • 有没有更好的方法不使用RE?
    6 回复  |  直到 6 年前
        1
  •  4
  •   Messa    6 年前

    为python 3更新:

    >>> 'Tannh‰user'.encode().decode('ascii', 'replace').replace(u'\ufffd', '_')
    'Tannh___user'
    

    首先,我们使用 encode() -它默认使用UTF-8编解码器。如果您有字节字符串,那么当然跳过这个编码步骤。 然后我们使用ASCII编解码器将其转换为“普通”字符串。

    这将使用UTF-8的属性,所有非ASCII字符都编码为值为>=0x80的字节序列。


    python 2的原始答案是:

    如何使用内置的 str.decode 方法:

    >>> 'Tannh‰user'.decode('ascii', 'replace').replace(u'\ufffd', '_')
    u'Tannh___user'
    

    (你得到 unicode 字符串,因此将其转换为 str 如果你需要的话)

    您也可以转换 统一码 STR ,因此一个非ASCII字符替换为ASCII字符。但问题是 unicode.encode 具有 replace 将非ASCII字符转换为 '?' 所以你不知道问号以前是否已经存在过;请看伊格纳西奥·瓦兹奎兹·艾布拉姆斯的解答。


    另一种方法,使用 ord() 并比较每个字符的值,如果它符合ASCII范围(0-127),这适用于 统一码 字符串和 STR 采用UTF-8、拉丁语和其他编码:

    >>> s = 'Tannh‰user' # or u'Tannh‰user' in Python 2
    >>> 
    >>> ''.join(c if ord(c) < 128 else '_' for c in s)
    'Tannh_user'
    
        2
  •  9
  •   interjay    14 年前
    re.sub(r'[^\x00-\x7F]', '_', theString)
    

    如果字符串是unicode,或者是一个字符串,其中ascii占用值0到0x7f(拉丁语-1、utf-8等),这将起作用。

        3
  •  5
  •   Ignacio Vazquez-Abrams    14 年前

    使用python对字符编码的支持:

    # coding: utf8
    import codecs
    
    def underscorereplace_errors(exc):
      return (u'_', exc.end)
    
    codecs.register_error('underscorereplace', underscorereplace_errors)
    
    print u'Tannh‰user'.encode('ascii', 'underscorereplace')
    
        4
  •  2
  •   Brian    14 年前

    我想打个电话 ord 在字符串中的每个字符上,1乘1。如果 ord([char]) >= 128 字符不是ASCII字符,应该替换。

        5
  •  1
  •   joaquin    14 年前

    如果知道要替换哪些字符,可以应用字符串方法

    mystring.replace('oldchar', 'newchar')
    
        6
  •  0
  •   Max Candocia    6 年前

    回答这个问题

    '[\u0080-\uFFFF]'
    

    将匹配不在前128个字符范围内的任何utf-8字符

    re.sub('[\u0080-\uFFFF]+', '_', x)
    

    将用下划线替换任何连续的非科学字符序列