去除口音和特殊字符

10

可能是重复问题:
如何在Python Unicode字符串中最好地去除重音符号?
Python和字符规范化

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

例如:

Frédér8ic@ --> frederic

建议:

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

有没有更好的方法来完成这个任务?


你能否编辑你的回答,包括一些所需输入和输出的示例? - Christian Neverdal
@Christian Jonassen Frédér8ic@ --> frederic @@àbcd --> abcd %*tréçd --> trecd - Fred
2
这可能不是重复的,因为 OP 想要的不仅仅是 Unicode 正规化。 - Abhijit
@Abhijit +1。我正在寻找比我的代码更高效的方法。 - Fred
2个回答

15

可能的解决方案是

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

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


2
但是在该命令中,字符串变量是什么?当您引用if x in string.ascii_letters时。 - Falcoa
@Falcoa 是正确的。还有另一种解决方案。def remove_accents(self, data): return unicodedata.normalize('NFKD', data).encode('ASCII', 'ignore') - lesimoes

1
你能把字符串转换成HTML实体吗?如果可以,那么你可以使用一个简单的正则表达式。
在PHP/PCRE中,以下替换方法可以使用(请参见我的另一个答案的示例):
'~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i' => '$1'

然后只需将HTML实体转换回来,并删除任何非a-Z字符({{link1:demo @ CodePad}})。

抱歉,我不太了解Python,无法提供Pythonic的答案。


1
我不确定正则表达式比UnicodeData更有效。 - Fred
@user1125315:我也不确定,但它能正确通过你的输入/输出测试。不过你可以尝试其他方法,unidecode 库似乎很棒。 - Alix Axel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接