去除重音和特殊字符

10 投票
2 回答
25399 浏览
提问于 2025-04-17 09:21

可能重复的问题:
在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()

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

2 个回答

1

你能把字符串转换成HTML实体吗?如果可以的话,你可以用一个简单的正则表达式来实现。

下面这个替换方法在PHP/PCRE中是可行的(想看例子可以参考我其他的回答):

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

然后只需要把HTML实体再转换回来,并去掉任何不是 a-Z 的字符(可以在CodePad上看演示)。

抱歉,我对Python不太了解,没法提供一个Python的答案。

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 来比较,去掉那些不在这个集合里的字符。

撰写回答