我正在尋求簡單的Python函數,該函數接受一個字符串並返回一個類似的字符,但所有非ASCII字符都轉換爲最接近的ascii等效字符。例如,音調符號和不應該丟棄的東西。 我想象一定有一個很好的規範方法來做到這一點,有很多相關的stackoverflow問題,但我沒有找到一個簡單的答案,所以它似乎值得一個單獨的問題。Python的正則表達式將字符串中的非ASCII字符轉換爲最接近的ASCII等價物
例輸入/輸出:
"Étienne" -> "Etienne"
我正在尋求簡單的Python函數,該函數接受一個字符串並返回一個類似的字符,但所有非ASCII字符都轉換爲最接近的ascii等效字符。例如,音調符號和不應該丟棄的東西。 我想象一定有一個很好的規範方法來做到這一點,有很多相關的stackoverflow問題,但我沒有找到一個簡單的答案,所以它似乎值得一個單獨的問題。Python的正則表達式將字符串中的非ASCII字符轉換爲最接近的ASCII等價物
例輸入/輸出:
"Étienne" -> "Etienne"
做着「的iconv TRANSLIT蟒蛇」的搜索,我發現: http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/它看起來像它可能是你所需要的。這些評論還有其他一些使用標準庫的想法。
還有http://web.archive.org/web/20070807224749/http://techxplorer.com/2006/07/18/converting-unicode-to-ascii-using-python/它使用NFKD來儘可能獲得基本字符。
在Python 3混合並在PyPI中的正則表達式實現:
以字符串開始:
>>> s = "Étienne"
正常化NFKD,然後刪除變音符號:
>>> import unicodedata
>>> import regex
>>> regex.sub(r"\p{Mn}", "", unicodedata.normalize("NFKD", s))
'Etienne'
這真的沒有太大的作用。例如,代碼點U + 00F8,*ø*,不會**分解爲Marks。但它仍具有與* o *相同的主歸類強度:每個DUCET 6.0有138E。類似地,對於代碼點U + 00F0,*ð。沒有分解*但是,它的主要整理強度與1250年的* d *相同。人們需要學習使用* Unicode來工作*,而不是針對它! – tchrist 2011-04-02 03:12:06
我看了你提到的圖書館,看起來很刺激。你是它的作者嗎?我一直對更好的Unicode支持的Python庫感興趣很長一段時間了。讓我看看它併發送給你郵件。非常感謝。 – tchrist 2011-04-02 05:23:43
您的代碼爲我打印出「Étienne」... – Cerin 2012-05-29 18:51:33
閱讀一些重複問題的答案。 NFKD噱頭只能用作口音剝離器。它不處理連字和許多其他基於拉丁語的字符,它們不能被分解(或不被分解)。爲此準備好的翻譯表是必要的(而且要快得多)。
謝謝約翰。我真的很討厭看到人們會破壞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
只要'pip安裝unidecode',即使有中文也可以運行!謝謝! – Adam 2014-05-05 10:42:14
你如何定義「最接近?」 – nmichaels 2010-09-30 18:47:49
好問題!我想我希望不必定義它,有一些標準的,可接受的映射。我確信這比我想象的要真正做得更好,但部分解決方案也是有價值的。 – dreeves 2010-09-30 18:55:43
'iconv'可以通過'// TRANSLIT'標誌來完成,不知道是否有適當的Python綁定。 – Wrikken 2010-09-30 18:57:29