解決python 文字過濾和清理問題
問題
某些無聊的指令碼小子在Web頁面表單中填入了“pýtĥöñ”這樣的文字,我們想以某種方式將其清理掉。
解決方案
文字過濾和清理所涵蓋的範圍非常廣泛,涉及文字解析和資料處理方面的問題。在非常簡單的層次上,我們可能會用基本的字串函式(例如str.upper()和str.lower())將文字轉換為標準形式。簡單的替換操作可通過str.replace()或re.sub()來完成,它們把重點放在移除或修改特定的字元序列上。也可以利用unicodedata.normalize()
來規範化文字。
然而我們可能想更進一步。比方說也許想清除整個範圍內的字元,或者去掉音符標誌。要完成這些任務,可以使用常被忽視的str.translate()方法。為了說明其用法,假設有如下這段混亂的字串:
>>> s = 'pytĥon\fis\tawesome\r\n' >>> s 'pytĥon\x0cis\tawesome\r\n' >>>
第一步是清理空格。要做到這步,先建立一個小型的轉換表,然後使用translate()方法:
>>> remap = { ... ord('\t') : ' ',... ord('\f') : ' ',... ord('\r') : None # Deleted ... } >>> a = s.translate(remap) >>> a 'pytĥon is awesome\n'
可以看到,類似t和f這樣的空格符已經被重新對映成一個單獨的空格。回車符r已經完全被刪除掉了。
可以利用這種重新對映的思想進一步構建出更加龐大的轉換表。例如,我們把所有的Unicode組合字元都去掉:
>>> 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ĥon 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()操作來修改或清理文字。示例如下:
>>> a 'pytĥon is awesome\n' >>> b = unicodedata.normalize('NFD',a) >>> b.encode('ascii','ignore').decode('ascii') 'python is awesome\n' >>>
這裡的normalize()方法先對原始文字做分解操作。後續的ASCII編碼/解碼只是簡單地一次性丟棄所有不需要的字元。很顯然,這種方法只有當我們的最終目標就是ASCII形式的文字時才有用。
討論
文字過濾和清理的一個主要問題就是執行時的效能。一般來說操作越簡單,執行得就越快。對於簡單的替換操作,用str.replace()通常是最快的方式——即使必須多次呼叫它也是如此。比方說如果要清理掉空格符,可以編寫如下的程式碼:
def clean_spaces(s): s = s.replace('\r','') s = s.replace('\t',' ') s = s.replace('\f',' ') return s
如果試著呼叫它,就會發現這比使用translate()
或者正則表示式的方法要快得多。
另一方面,如果需要做任何高階的操作,比如字元到字元的重對映或刪除,那麼translate()方法還是非常快的。
從整體來看,我們應該在具體的應用中去進一步揣摩效能方面的問題。不幸的是,想在技術上給出一條“放之四海而皆準”的建議是不可能的,所以應該嘗試多種不同的方法,然後做效能統計分析。
儘管本節的內容主要關注的是文字,但類似的技術也同樣適用於位元組物件(byte),這包括簡單的替換、翻譯和正則表示式。
總結
以上所述是小編給大家介紹的解決python 文字過濾和清理問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!