《Python Cookbook 3rd》笔记(2.9):将Unicode文本标准化
將 Unicode 文本標準化
問題
你正在處理 Unicode 字符串,需要確保所有字符串在底層有相同的表示。
解法
在 Unicode 中,某些字符能夠用多個合法的編碼表示。為了說明,考慮下面的這個例子:
>>> s1 = 'Spicy Jalape\u00f1o' >>> s2 = 'Spicy Jalapen\u0303o' >>> s1 'Spicy Jalape?o' >>> s2 'Spicy Jalape?o' >>> s1 == s2 False >>> len(s1) 14 >>> len(s2) 15 >>>這里的文本”Spicy Jalape?o” 使用了兩種形式來表示。第一種使用整體字符”?”(U+00F1),第二種使用拉丁字母”n” 后面跟一個”?” 的組合字符 (U+0303)。
在需要比較字符串的程序中使用字符的多種表示會產生問題。為了修正這個問題,你可以使用 unicodedata 模塊先將文本標準化:
>>> import unicodedata >>> t1 = unicodedata.normalize('NFC', s1) >>> t2 = unicodedata.normalize('NFC', s2) >>> t1 == t2 True >>> print(ascii(t1)) 'Spicy Jalape\xf1o' >>> t3 = unicodedata.normalize('NFD', s1) >>> t4 = unicodedata.normalize('NFD', s2) >>> t3 == t4 True >>> print(ascii(t3)) 'Spicy Jalapen\u0303o' >>>normalize() 第一個參數指定字符串標準化的方式。 NFC 表示字符應該是整體組
成 (比如可能的話就使用單一編碼),而 NFD 表示字符應該分解為多個組合字符表示。
Python 同樣支持擴展的標準化形式 NFKC 和 NFKD,它們在處理某些字符的時候
增加了額外的兼容特性。比如:
討論
標準化對于任何需要以一致的方式處理 Unicode 文本的程序都是非常重要的。當處理來自用戶輸入的字符串而你很難去控制編碼的時候尤其如此。
在清理和過濾文本的時候字符的標準化也是很重要的。比如,假設你想清除掉一些文本上面的變音符的時候 (可能是為了搜索和匹配):
>>> t1 = unicodedata.normalize('NFD', s1) >>> ''.join(c for c in t1 if not unicodedata.combining(c)) 'Spicy Jalapeno' >>>最后一個例子展示了 unicodedata 模塊的另一個重要方面,也就是測試字符類的工具函數。 combining() 函數可以測試一個字符是否為和音字符。在這個模塊中還有其他函數用于查找字符類別,測試是否為數字字符等等。
總結
以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(2.9):将Unicode文本标准化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习基础-吴恩达-coursera-
- 下一篇: LeetCode - Easy - 14