2010-09-30 77 views
12

我正在尋求簡單的Python函數,該函數接受一個字符串並返回一個類似的字符,但所有非ASCII字符都轉換爲最接近的ascii等效字符。例如,音調符號和不應該丟棄的東西。 我想象一定有一個很好的規範方法來做到這一點,有很多相關的stackoverflow問題,但我沒有找到一個簡單的答案,所以它似乎值得一個單獨的問題。Python的正則表達式將字符串中的非ASCII字符轉換爲最接近的ASCII等價物

例輸入/輸出:

"Étienne" -> "Etienne" 
+6

你如何定義「最接近?」 – nmichaels 2010-09-30 18:47:49

+0

好問題!我想我希望不必定義它,有一些標準的,可接受的映射。我確信這比我想象的要真正做得更好,但部分解決方案也是有價值的。 – dreeves 2010-09-30 18:55:43

+2

'iconv'可以通過'// TRANSLIT'標誌來完成,不知道是否有適當的Python綁定。 – Wrikken 2010-09-30 18:57:29

回答

2

在Python 3混合並在PyPI中的正則表達式實現:

以字符串開始:

>>> s = "Étienne" 

正常化NFKD,然後刪除變音符號:

>>> import unicodedata 
>>> import regex 
>>> regex.sub(r"\p{Mn}", "", unicodedata.normalize("NFKD", s)) 
'Etienne' 
+1

這真的沒有太大的作用。例如,代碼點U + 00F8,*ø*,不會**分解爲Marks。但它仍具有與* o *相同的主歸類強度:每個DUCET 6.0有138E。類似地,對於代碼點U + 00F0,*ð。沒有分解*但是,它的主要整理強度與1250年的* d *相同。人們需要學習使用* Unicode來工作*,而不是針對它! – tchrist 2011-04-02 03:12:06

+0

我看了你提到的圖書館,看起來很刺激。你是它的作者嗎?我一直對更好的Unicode支持的Python庫感興趣很長一段時間了。讓我看看它併發送給你郵件。非常感謝。 – tchrist 2011-04-02 05:23:43

+0

您的代碼爲我打印出「Étienne」... – Cerin 2012-05-29 18:51:33

1

閱讀一些重複問題的答案。 NFKD噱頭只能用作口音剝離器。它不處理連字和許多其他基於拉丁語的字符,它們不能被分解(或不被分解)。爲此準備好的翻譯表是必要的(而且要快得多)。

+0

謝謝約翰。我真的很討厭看到人們會破壞Unicode數據。通常是因爲他們不知道如何在排序強度1(主)上進行比較。例如,在1級,有99個A,43個B,53個C等。O在111處最多,Q在34處最少.NFKD稍微提高了這些數字,例如將A的數量增加到115,O的數量增加到119。 – tchrist 2011-04-02 03:07:00

相關問題