删除重音和特殊字符[重复]

Posted

技术标签:

【中文标题】删除重音和特殊字符[重复]【英文标题】: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。我搜索的效率比我的代码高 【参考方案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')

以上是关于删除重音和特殊字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

XMLHTTP 和特殊字符(例如,重音符号)

编码特殊字符以传入url并由javascript读取[重复]

如何防止写入特殊字符[重复]

有没有办法突出显示崇高文本或任何其他文本编辑器中的所有特殊重音字符?

PyYaml - 使用特殊字符(即重音符号)转储 unicode

使用php和正则表达式从字符串中删除数字和特殊字符[重复]