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

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

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

我在Web上发现了一种用Java实现这一目标的优雅方法:

  1. 将Unicode字符串转换为它的长规范化形式(字母和数字符号有一个单独的字符)
  2. 删除Unicode类型为“diacritic”的所有字符。

我需要安装像pyICU这样的库吗?或者仅仅用python标准库就可以了吗?那蟒蛇3呢?

重要注意事项:我想避免代码从重音字符到非重音字符之间的显式映射。


九州编程
浏览 946回答 3
3回答

Helenr

统一码这是正确的答案。它将任何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 unicodedatadef 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的答案中的合并(我没有想到独角兽数据,但它可能是更好的解决方案,因为它更明确)。请记住,这些操作可能会显着地改变文本的意义。口音、乌姆劳斯等不是“装饰”。

慕仙森

我刚在网上找到了这个答案:import unicodedatadef remove_accents(input_str):     nfkd_form = unicodedata.normalize('NFKD', input_str)     only_ascii = nfkd_form.encode('ASCII', 'ignore')     return only_ascii它运行得很好(例如,法语),但我认为第二步(删除重音)可以比删除非ASCII字符更好,因为对于某些语言(例如希腊语)来说,这将失败。最好的解决方案可能是显式删除被标记为Diacritics的Unicode字符。编辑:这起作用是:import unicodedatadef 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,则返回true。c可以与前面的字符组合,这主要是如果它是一个对话框。编辑2: remove_accents期望Unicode字符串,而不是字节字符串。如果有字节字符串,则必须将其解码为如下所示的Unicode字符串:encoding = "utf-8" # or iso-8859-15, or cp1252, or whatever encoding you usebyte_string = b"café"   # or simply "café" before python 3.unicode_string = byte_string.decode(encoding)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python