2012-01-01 128 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