删除Python unicode字符串中的重音符号的最佳方法是什么?

我在Python中有一个Unicode字符串,我想删除所有的重音符(变音符号)。

我在网上找到了一个在Java中做到这一点的优雅方法:

  • 将Unicode字符串转换为其长规格化格式(使用字母和变音符的单独字符)
  • 删除Unicode类型为“diacritic”的所有字符。
  • 我是否需要安装一个库,比如pyICU,或者只用python标准库就可以吗? 那么python 3呢?

    重要说明:我想避免使用从重音字符到非重音对象的显式映射的代码。


    Unidecode是这个的正确答案。 它将任何unicode字符串音译为ascii文本中最接近的可能表示形式。

    例:

    accented_string = u'Málaga'
    # accented_string is of type 'unicode'
    import unidecode
    unaccented_string = unidecode.unidecode(accented_string)
    # unaccented_string contains 'Malaga'and is of type 'str'
    

    这个怎么样:

    import unicodedata
    def strip_accents(s):
       return ''.join(c for c in unicodedata.normalize('NFD', s)
                      if unicodedata.category(c) != 'Mn')
    

    这也适用于希腊字母:

    >>> strip_accents(u"A u00c0 u0394 u038E")
    u'A A u0394 u03a5'
    >>> 
    

    字符类别“Mn”代表Nonspacing_Mark ,类似于MiniQuark答案中的unicodedata.combining(我没有想到unicodedata.combining,但它可能是更好的解决方案,因为它更明确)。

    请记住,这些操作可能会显着改变文本的含义。 口音,变音等不是“装饰”。


    我刚刚在网上找到了这个答案:

    import unicodedata
    
    def remove_accents(input_str):
        nfkd_form = unicodedata.normalize('NFKD', input_str)
        only_ascii = nfkd_form.encode('ASCII', 'ignore')
        return only_ascii
    

    它工作正常(例如法语),但我认为第二步(删除重音符号)可以比删除非ASCII字符更好地处理,因为某些语言(例如希腊语)会失败。 最好的解决方案可能是明确删除被标记为变音符的unicode字符。

    编辑 :这是诀窍:

    import unicodedata
    
    def remove_accents(input_str):
        nfkd_form = unicodedata.normalize('NFKD', input_str)
        return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
    

    unicodedata.combining(c)将返回true,如果字符c可以与前面的字符组合,那主要是它是一个变音符号。

    编辑2remove_accents需要一个unicode字符串,而不是一个字节字符串。 如果你有一个字节字符串,那么你必须把它解码为一个unicode字符串,如下所示:

    encoding = "utf-8" # or iso-8859-15, or cp1252, or whatever encoding you use
    byte_string = b"café"  # or simply "café" before python 3.
    unicode_string = byte_string.decode(encoding)
    
    链接地址: http://www.djcxy.com/p/9399.html

    上一篇: What is the best way to remove accents in a Python unicode string?

    下一篇: Python list slice syntax used for no obvious reason