《Python Cookbook 3rd》笔记(2.12):审查清理文本字符串
審查清理文本字符串
問題
一些無聊的幼稚黑客將你的網站頁面中的“python”改成“pyt???”,然后你想將這些字符清理掉。
解法
文本清理問題會涉及到包括文本解析與數據處理等一系列問題。在非常簡單的情形下,你可能會選擇使用字符串函數 (比如 str.upper() 和 str.lower() ) 將文本轉為標準格式。使用 str.replace() 或者 re.sub() 的簡單替換操作能刪除或者改變指定的字符序列。你同樣還可以使用 2.9 小節的 unicodedata.normalize() 函數將 unicode文本標準化。
然后,有時候你可能還想在清理操作上更進一步。比如,你可能想消除整個區間上的字符或者去除變音符。為了這樣做,你可以使用經常會被忽視的 str.translate()方法。為了演示,假設你現在有下面這個凌亂的字符串:
>>> s = 'pyt???\fis\tawesome\r\n' >>> s 'pyt???\x0cis\tawesome\r\n' >>>第一步是清理空白字符。為了這樣做,先創建一個小的轉換表格然后使用translate() 方法:
>>> remap = { ... ord('\t') : ' ', ... ord('\f') : ' ', ... ord('\r') : None # Deleted ... } >>> a = s.translate(remap) >>> a 'pyt??? is awesome\n' >>>正如你看的那樣,空白字符 nt 和 nf 已經被重新映射到一個空格。回車字符 r 直接被刪除。
你可以以這個表格為基礎進一步構建更大的表格。比如,讓我們刪除所有的和音符:
>>> import unicodedata >>> import sys >>> cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode) ... if unicodedata.combining(chr(c))) ... >>> b = unicodedata.normalize('NFD', a) >>> b 'pyt??? is awesome\n' >>> b.translate(cmb_chrs) 'python is awesome\n' >>>上面例子中,通過使用 dict.fromkeys() 方法構造一個字典,每個 Unicode 和音符作為鍵,對于的值全部為 None 。
然后使用 unicodedata.normalize() 將原始輸入標準化為分解形式字符。然后再調用 translate 函數刪除所有重音符。同樣的技術也可以被用來刪除其他類型的字符
(比如控制字符等)。
作為另一個例子,這里構造一個將所有 Unicode 數字字符映射到對應的 ASCII 字符上的表格:
>>> digitmap = { c: ord('0') + unicodedata.digit(chr(c)) ... for c in range(sys.maxunicode) ... if unicodedata.category(chr(c)) == 'Nd' } ... >>> len(digitmap) 460 >>> # Arabic digits >>> x = '\u0661\u0662\u0663' >>> x.translate(digitmap) '123' >>>另一種清理文本的技術涉及到 I/O 解碼與編碼函數。這里的思路是先對文本做一
些初步的清理,然后再結合 encode() 或者 decode() 操作來清除或修改它。比如:
這里的標準化操作將原來的文本分解為單獨的和音符。接下來的 ASCII 編碼/解碼只是簡單的一下子丟棄掉那些字符。當然,這種方法僅僅只在最后的目標就是獲取到文本對應 ACSII 表示的時候生效。
討論
文本字符清理一個最主要的問題應該是運行的性能。一般來講,代碼越簡單運行越快。對于簡單的替換操作, str.replace() 方法通常是最快的,甚至在你需要多次調用的時候。比如,為了清理空白字符,你可以這樣做:
def clean_spaces(s):s = s.replace('\r', '')s = s.replace('\t', ' ')s = s.replace('\f', ' ')return s如果你去測試的話,你就會發現這種方式會比使用 translate() 或者正則表達式要快很多。
另一方面,如果你需要執行任何復雜字符對字符的重新映射或者刪除操作的話,tanslate() 方法會非常的快。
從大的方面來講,對于你的應用程序來說性能是你不得不去自己研究的東西。不幸的是,我們不可能給你建議一個特定的技術,使它能夠適應所有的情況。因此實際情況中需要你自己去嘗試不同的方法并評估它。
盡管本文中討論的是文本,但是類似的技術也可以適用于字節,包括簡單的替換,轉換和正則表達式。
總結
以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(2.12):审查清理文本字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python(21)--变量进阶
- 下一篇: Python(25)-单例设计模式