2012-01-01 120 views
9

可能重复:
What is the best way to remove accents in a python unicode string?
Python and character normalization去除重音和特殊字符

我想去掉口音,把所有字符转换为小写,并删除任何数字和特殊字符。

例子:

Frédé[email protected] - >弗雷德里克

建议:

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

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

+0

你能编辑你的答案,包括一些期望的输入和输出的例子吗? – 2012-01-01 18:56:22

+0

@Christian JonassenFrédé[email protected] - > frederic @@àbcd - > abcd%*tréçd - > trecd – Fred 2012-01-01 19:00:20

+0

我使用python 3.x – Fred 2012-01-01 19:24:15

回答

14

一个可能的解决办法是

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

使用NFKD据我所知是正常化的unicode将其转换为兼容字符的标准方式。剩下的就是删除标准化后的特殊字符和unicode字符,你可以简单地比较一下string.ascii_letters并删除那些不在那个字符集中的字符。

+0

非常好,谢谢! – Fred 2012-01-01 19:45:41

+2

但是该命令中的字符串变量是什么? 你在哪里提到'如果x在string.ascii_letters' – Falcoa 2017-01-17 12:33:31

+0

@Falcoa是可行的。还有另一种解决方案 def remove_accents(self,data): return unicodedata.normalize('NFKD',data).encode('ASCII','ignore') – lesimoes 2017-04-19 15:32:27

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 CHAR(demo @ CodePad)。

对不起,我不知道Python足以提供Pythonic答案。

+1

我不确定正则表达式比UnicodeData更有效 – Fred 2012-01-01 19:36:31

+0

@ user1125315:我也不确定,但它正确地通过了您的输入/输出测试。尽管尝试其他方法,但'unidecode'库似乎很棒。 – 2012-01-01 19:41:52