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

2024-04-25 01:24:08 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

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

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)])

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

编辑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)

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

character category“Mn”代表Nonspacing_Mark,这与MiniQuark的答案unicodedata.combing类似(我没有想到unicodedata.combing,但它可能是更好的解决方案,因为它更明确)。

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

相关问题 更多 >