摘要:上一篇文章實用技法第篇從字符串中去掉不需要的字符下一篇文章實用技法第篇對齊文本字符串問題某些無聊的腳本小子在頁面表單中填入了這樣的文本,我們想以某種方式將其清理掉。討論文本過濾和清理的一個主要問題就是運行時的性能。
上一篇文章:Python實用技法第30篇:從字符串中去掉不需要的字符問題
下一篇文章:Python實用技法第32篇:對齊文本字符串
某些無聊的腳本小子在Web頁面表單中填入了“pyt???”這樣的文本,我們想以某種方式將其清理掉。
解決方案文本過濾和清理所涵蓋的范圍非常廣泛,涉及文本解析和數(shù)據(jù)處理方面的問題。在非常簡單的層次上,我們可能會用基本的字符串函數(shù)(例如str.upper()和str.lower())將文本轉(zhuǎn)換為標準形式。簡單的替換操作可通過str.replace()或re.sub()來完成,它們把重點放在移除或修改特定的字符序列上。也可以利用unicodedata.normalize()來規(guī)范化文本。
然而我們可能想更進一步。比方說也許想清除整個范圍內(nèi)的字符,或者去掉音符標志。要完成這些任務(wù),可以使用常被忽視的str.translate()方法。為了說明其用法,假設(shè)有如下這段混亂的字符串:
>>> s = "pyt?onfis awesome " >>> s "pyt?onx0cis awesome " >>>
第一步是清理空格。要做到這步,先建立一個小型的轉(zhuǎn)換表,然后使用translate()方法:
>>> remap = { ... ord(" ") : " ", ... ord("f") : " ", ... ord(" ") : None # Deleted ... } >>> a = s.translate(remap) >>> a "pyt?on is awesome "
可以看到,類似t和f這樣的空格符已經(jīng)被重新映射成一個多帶帶的空格?;剀嚪鹯已經(jīng)完全被刪除掉了。
可以利用這種重新映射的思想進一步構(gòu)建出更加龐大的轉(zhuǎn)換表。例如,我們把所有的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 " >>> b.translate(cmb_chrs) "python is awesome " >>>
在這個例子中,我們使用dict.fromkeys()方法構(gòu)建了一個將每個Unicode組合字符都映射為None的字典。
原始輸入會通過unicodedata.normalize()方法轉(zhuǎn)換為分離形式,然后再通過translate()方法刪除所有的重音符號。我們也可以利用相似的技術(shù)來去掉其他類型的字符(例如控制字符)。
下面來看另一個例子。這里有一張轉(zhuǎn)換表將所有的Unicode十進制數(shù)字字符映射為它們對應(yīng)的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 = "u0661u0662u0663" >>> x.translate(digitmap) "123" >>>
另一種用來清理文本的技術(shù)涉及I/O解碼和編碼函數(shù)。大致思路是首先對文本做初步的清理,然后通過結(jié)合encode()和decode()操作來修改或清理文本。示例如下:
>>> a "pyt?on is awesome " >>> b = unicodedata.normalize("NFD", a) >>> b.encode("ascii", "ignore").decode("ascii") "python is awesome " >>>
這里的normalize()方法先對原始文本做分解操作。后續(xù)的ASCII編碼/解碼只是簡單地一次性丟棄所有不需要的字符。很顯然,這種方法只有當我們的最終目標就是ASCII形式的文本時才有用。
討論文本過濾和清理的一個主要問題就是運行時的性能。一般來說操作越簡單,運行得就越快。對于簡單的替換操作,用str.replace()通常是最快的方式——即使必須多次調(diào)用它也是如此。比方說如果要清理掉空格符,可以編寫如下的代碼:
def clean_spaces(s): s = s.replace(" ", "") s = s.replace(" ", " ") s = s.replace("f", " ") return s
如果試著調(diào)用它,就會發(fā)現(xiàn)這比使用translate()或者正則表達式的方法要快得多。
另一方面,如果需要做任何高級的操作,比如字符到字符的重映射或刪除,那么translate()方法還是非??斓?。
從整體來看,我們應(yīng)該在具體的應(yīng)用中去進一步揣摩性能方面的問題。不幸的是,想在技術(shù)上給出一條“放之四海而皆準”的建議是不可能的,所以應(yīng)該嘗試多種不同的方法,然后做性能統(tǒng)計分析。
盡管本節(jié)的內(nèi)容主要關(guān)注的是文本,但類似的技術(shù)也同樣適用于字節(jié)對象(byte),這包括簡單的替換、翻譯和正則表達式。
上一篇文章:Python實用技法第30篇:從字符串中去掉不需要的字符
下一篇文章:Python實用技法第32篇:對齊文本字符串
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44124.html
摘要:解決方案對于基本的字符串對齊要求,可以使用字符串的和方法。例如的好處之一是它并不是特定于字符串的。此外,可作用于任意類型的對象,比字符串的以及方法要更加通用。上一篇文章實用技法第篇文本過濾和清理下一篇文章實用技法第篇字符串連接及合并 上一篇文章:Python實用技法第31篇:文本過濾和清理下一篇文章:Python實用技法第33篇:字符串連接及合并 問題 我們需要以某種對齊方式將文本...
摘要:上一篇文章實用技法第篇用正則表達式處理字符下一篇文章實用技法第篇文本過濾和清理問題我們想在字符串的開始結(jié)尾或中間去掉不需要的字符,比如說空格符。解決方案方法可用來從字符串的開始和結(jié)尾處去掉字符。 上一篇文章: Python實用技法第29篇:用正則表達式處理Unicode字符下一篇文章:Python實用技法第31篇:文本過濾和清理 問題 我們想在字符串的開始、結(jié)尾或中間去掉不需要的字...
摘要:上一篇文章實用技法第篇正則文本模式的匹配和查找下一篇文章實用技法第篇正則以不區(qū)分大小寫的方式對文本做查找和替換需求 上一篇文章:Python實用技法第23篇:正則:文本模式的匹配和查找下一篇文章:Python實用技法第25篇:正則:以不區(qū)分大小寫的方式對文本做查找和替換 1、需求
摘要:上一篇文章實用技法第篇利用通配符做字符串匹配下一篇文章實用技法第篇正則查找和替換文本需求 上一篇文章:Python實用技法第22篇:利用Shell通配符做字符串匹配下一篇文章:Python實用技法第24篇:正則:查找和替換文本 1、需求
摘要:上一篇文章實用技法第篇正則查找和替換文本下一篇文章實用技法第篇定義實現(xiàn)最短匹配的正則表達式需求 上一篇文章:Python實用技法第24篇:正則:查找和替換文本下一篇文章:Python實用技法第26篇:定義實現(xiàn)最短匹配的正則表達式 1、需求
閱讀 3291·2021-11-25 09:43
閱讀 2092·2021-09-22 10:02
閱讀 3347·2021-09-06 15:00
閱讀 2304·2019-08-30 15:56
閱讀 2356·2019-08-30 15:54
閱讀 3232·2019-08-30 14:14
閱讀 2268·2019-08-29 17:25
閱讀 2909·2019-08-29 17:16