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

新手上路,请多包涵

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

我在网上找到了一种优雅的方式来做到这一点(在 Java 中):

  1. 将 Unicode 字符串转换为其 _长规范化形式_(字母和变音符号使用单独的字符)
  2. 删除所有 Unicode 类型为“变音符号”的字符。

我是否需要安装诸如 pyICU 之类的库,或者仅使用 Python 标准库是否可行?那么 python 3 呢?

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

原文由 MiniQuark 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 587
2 个回答

这个怎么样:

 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,但它可能是更好的解决方案,因为它更明确) .

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

原文由 oefe 发布,翻译遵循 CC BY-SA 3.0 许可协议

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'

原文由 Christian Oudard 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题