【问题标题】:Python regex to convert non-ascii characters in a string to closest ascii equivalentsPython正则表达式将字符串中的非ascii字符转换为最接近的ascii等价物
【发布时间】:2010-09-30 18:46:09
【问题描述】:

我正在寻找一个简单的 Python 函数,它接受一个字符串并返回一个类似的字符串,但所有非 ascii 字符都转换为最接近的 ascii 等效字符。 例如,应该删除变音符号和诸如此类的东西。 我想一定有一个非常规范的方法来做到这一点,并且有很多相关的 stackoverflow 问题,但我没有找到一个简单的答案,所以它似乎值得一个单独的问题。

输入/输出示例:

"Étienne" -> "Etienne"

【问题讨论】:

标签: python regex character-encoding ascii special-characters


【解决方案1】:

阅读这个问题让我开始寻找更好的东西。

https://pypi.python.org/pypi/Unidecode/0.04.1

完全符合您的要求。

【讨论】:

  • 只需pip install unidecode,它甚至适用于中文!谢谢!
【解决方案2】:

在 Python 3 中并在 PyPI 中使用正则表达式实现:

http://pypi.python.org/pypi/regex

以字符串开头:

>>> s = "Étienne"

标准化为 NFKD,然后删除变音符号:

>>> import unicodedata
>>> import regex
>>> regex.sub(r"\p{Mn}", "", unicodedata.normalize("NFKD", s))
'Etienne'

【讨论】:

  • 这真的没什么用。例如,代码点 U+00F8,ønot 分解为带有标记的东西。但它仍然具有与 o 相同的主要整理强度:每个 DUCET 6.0 138E。同样,对于码位U+00F0,ð也没有分解。但是它的主要排序强度与1250处的d相同。人们需要学会工作使用 Unicode,而不是反对它!
  • 我看过你提到的库,它看起来非常令人兴奋。你是它的作者吗?很长一段时间以来,我一直对具有更好的 Unicode 支持的 Python 库感兴趣。让我看看然后给你发邮件。非常感谢。
  • 你能解释一下r"\p{Mn}"的含义吗?我刚刚阅读了正则表达式文档,但我不明白 Mn 的含义。
  • \p{Mn} 将匹配具有Mn 或(或Nonspacing_Mark)Unicode 属性的代码点。其他属性包括Lu (Uppercase_Letter) 和Cyrillic
【解决方案3】:

搜索“iconv TRANSLIT python”我发现: http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/ 看起来可能是您需要的。 cmets 有一些其他的想法,它们使用标准库来代替。

还有http://web.archive.org/web/20070807224749/http://techxplorer.com/2006/07/18/converting-unicode-to-ascii-using-python/,它使用 NFKD 尽可能获取基本字符。

【讨论】:

    【解决方案4】:

    阅读一些重复问题的答案。 NFKD 噱头仅用作口音剥离器。它不处理连字和许多其他不能(或不能)分解的基于拉丁语的字符。为此,需要一个准备好的翻译表(而且要快得多)。

    【讨论】:

    • 谢谢约翰。我真的很讨厌看到人们破坏 Unicode 数据。通常是因为他们不知道如何仅在排序规则强度 1(主要)下进行比较。例如,在 1 级有 99 个 A、43 个 B、53 个 C 等。O 最多,为 111,Q 最少,为 34。NFKD 稍微提高了这些数字,例如,将 A 增加到 115,将 O 增加到 119。
    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 2012-08-02
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多