【问题标题】:removing accent and special characters [duplicate]删除重音和特殊字符[重复]
【发布时间】:2012-01-31 11:06:04
【问题描述】:

可能重复:
What is the best way to remove accents in a python unicode string?
Python and character normalization

我想删除重音符号,将所有字符转为小写,并删除所有数字和特殊字符。

例子:

Frédér8ic@ --> 弗雷德里克

建议:

def remove_accents(data):
    return ''.join(x for x in unicodedata.normalize('NFKD', data) if \
    unicodedata.category(x)[0] == 'L').lower()

有没有更好的方法来做到这一点?

【问题讨论】:

  • 您能否编辑您的答案以包含一些所需输入和输出的示例?
  • @Christian Jonassen Frédér8ic@ --> frederic @@àbcd --> abcd %*tréçd --> trecd
  • 考虑到 OP 想要的不仅仅是 unicode 规范化,这可能不是重复的。
  • @Abhijit +1。我搜索的效率比我的代码高

标签: python diacritics


【解决方案1】:

你能把字符串转换成 HTML 实体吗?如果是这样,您可以使用简单的正则表达式。

以下替换可以在 PHP/PCRE 中使用(参见my other answer 示例):

'~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i' => '$1'

然后简单地从 HTML 实体转换回来并删除任何非 a-Z 字符 (demo @ CodePad)。

抱歉,我对 Python 的了解不够,无法提供 Python 式的答案。

【讨论】:

  • 我不确定正则表达式是否比 UnicodeData 更有效
  • @user1125315:我也不确定,但它正确地通过了您的输入/输出测试。不过,请随意尝试其他方法,unidecode 库似乎很棒。
【解决方案2】:

一个可能的解决方案是

def remove_accents(data):
    return ''.join(x for x in unicodedata.normalize('NFKD', data) if x in string.printable).lower()

使用 NFKD AFAIK 是标准化 unicode 以将其转换为兼容字符的标准方法。其余的要删除源自规范化的特殊字符数字和 unicode 字符,您可以简单地与 string.ascii_letters 进行比较并删除任何不在该集合中的字符。

【讨论】:

  • 但是该命令中的字符串变量是什么?你在哪里引用if x in string.ascii_letters
  • @Falcoa 是正确的。还有另一种解决方案 def remove_accents(self, data): return unicodedata.normalize('NFKD', data).encode('ASCII', 'ignore')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2014-05-20
相关资源
最近更新 更多