解決python 文本過(guò)濾和清理問(wèn)題
問(wèn)題
某些無(wú)聊的腳本小子在Web頁(yè)面表單中填入了“pýtĥöñ”這樣的文本,我們想以某種方式將其清理掉。
解決方案
文本過(guò)濾和清理所涵蓋的范圍非常廣泛,涉及文本解析和數(shù)據(jù)處理方面的問(wèn)題。在非常簡(jiǎn)單的層次上,我們可能會(huì)用基本的字符串函數(shù)(例如str.upper()和str.lower())將文本轉(zhuǎn)換為標(biāo)準(zhǔn)形式。簡(jiǎn)單的替換操作可通過(guò)str.replace()或re.sub()來(lái)完成,它們把重點(diǎn)放在移除或修改特定的字符序列上。也可以利用unicodedata.normalize()來(lái)規(guī)范化文本。
然而我們可能想更進(jìn)一步。比方說(shuō)也許想清除整個(gè)范圍內(nèi)的字符,或者去掉音符標(biāo)志。要完成這些任務(wù),可以使用常被忽視的str.translate()方法。為了說(shuō)明其用法,假設(shè)有如下這段混亂的字符串:
>>> s = 'pytĥon\fis\tawesome\r\n' >>> s 'pytĥon\x0cis\tawesome\r\n' >>>
第一步是清理空格。要做到這步,先建立一個(gè)小型的轉(zhuǎn)換表,然后使用translate()方法:
>>> remap = {
... ord('\t') : ' ',
... ord('\f') : ' ',
... ord('\r') : None # Deleted
... }
>>> a = s.translate(remap)
>>> a
'pytĥon is awesome\n'
可以看到,類(lèi)似t和f這樣的空格符已經(jīng)被重新映射成一個(gè)單獨(dú)的空格。回車(chē)符r已經(jīng)完全被刪除掉了。
可以利用這種重新映射的思想進(jìn)一步構(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\n'
>>> b.translate(cmb_chrs)
'python is awesome\n'
>>>
在這個(gè)例子中,我們使用dict.fromkeys()方法構(gòu)建了一個(gè)將每個(gè)Unicode組合字符都映射為None的字典。
原始輸入會(huì)通過(guò)unicodedata.normalize()方法轉(zhuǎn)換為分離形式,然后再通過(guò)translate()方法刪除所有的重音符號(hào)。我們也可以利用相似的技術(shù)來(lái)去掉其他類(lèi)型的字符(例如控制字符)。
下面來(lái)看另一個(gè)例子。這里有一張轉(zhuǎn)換表將所有的Unicode十進(jìn)制數(shù)字字符映射為它們對(duì)應(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 = '\u0661\u0662\u0663'
>>> x.translate(digitmap)
'123'
>>>
另一種用來(lái)清理文本的技術(shù)涉及I/O解碼和編碼函數(shù)。大致思路是首先對(duì)文本做初步的清理,然后通過(guò)結(jié)合encode()和decode()操作來(lái)修改或清理文本。示例如下:
>>> a
'pytĥon is awesome\n'
>>> b = unicodedata.normalize('NFD', a)
>>> b.encode('ascii', 'ignore').decode('ascii')
'python is awesome\n'
>>>
這里的normalize()方法先對(duì)原始文本做分解操作。后續(xù)的ASCII編碼/解碼只是簡(jiǎn)單地一次性丟棄所有不需要的字符。很顯然,這種方法只有當(dāng)我們的最終目標(biāo)就是ASCII形式的文本時(shí)才有用。
討論
文本過(guò)濾和清理的一個(gè)主要問(wèn)題就是運(yùn)行時(shí)的性能。一般來(lái)說(shuō)操作越簡(jiǎn)單,運(yùn)行得就越快。對(duì)于簡(jiǎn)單的替換操作,用str.replace()通常是最快的方式——即使必須多次調(diào)用它也是如此。比方說(shuō)如果要清理掉空格符,可以編寫(xiě)如下的代碼:
def clean_spaces(s):
s = s.replace('\r', '')
s = s.replace('\t', ' ')
s = s.replace('\f', ' ')
return s
如果試著調(diào)用它,就會(huì)發(fā)現(xiàn)這比使用translate()或者正則表達(dá)式的方法要快得多。
另一方面,如果需要做任何高級(jí)的操作,比如字符到字符的重映射或刪除,那么translate()方法還是非常快的。
從整體來(lái)看,我們應(yīng)該在具體的應(yīng)用中去進(jìn)一步揣摩性能方面的問(wèn)題。不幸的是,想在技術(shù)上給出一條“放之四海而皆準(zhǔn)”的建議是不可能的,所以應(yīng)該嘗試多種不同的方法,然后做性能統(tǒng)計(jì)分析。
盡管本節(jié)的內(nèi)容主要關(guān)注的是文本,但類(lèi)似的技術(shù)也同樣適用于字節(jié)對(duì)象(byte),這包括簡(jiǎn)單的替換、翻譯和正則表達(dá)式。
總結(jié)
以上所述是小編給大家介紹的解決python 文本過(guò)濾和清理問(wèn)題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
- 淺談Python 敏感詞過(guò)濾的實(shí)現(xiàn)
- 一行Python代碼過(guò)濾標(biāo)點(diǎn)符號(hào)等特殊字符
- 使用Filter過(guò)濾python中的日志輸出的實(shí)現(xiàn)方法
- Python使用正則表達(dá)式去除(過(guò)濾)HTML標(biāo)簽提取文字功能
- Python學(xué)習(xí)筆記之pandas索引列、過(guò)濾、分組、求和功能示例
- Python中字符串String的基本內(nèi)置函數(shù)與過(guò)濾字符模塊函數(shù)的基本用法
- 對(duì)python字典過(guò)濾條件的實(shí)例詳解
- Python自定義計(jì)算時(shí)間過(guò)濾器實(shí)現(xiàn)過(guò)程解析
相關(guān)文章
Opencv實(shí)現(xiàn)鼠標(biāo)事件與窗口互動(dòng)功能過(guò)程
平時(shí)在做圖像處理demo或者研究測(cè)試算法時(shí),經(jīng)常會(huì)用到imshow和鼠標(biāo)的交互,比如在顯示圖像的窗口上畫(huà)點(diǎn)、線(xiàn)、圓、矩形、多邊形等操作,故在此做出用法總結(jié)2022-12-12
python解決循環(huán)依賴(lài)的問(wèn)題分析
在使用python開(kāi)發(fā)過(guò)程中在引入其他模塊時(shí)可能都經(jīng)歷過(guò)一個(gè)異常就是循環(huán)引用most likely due to a circular import,它的意思就是A引用了B,反過(guò)來(lái)B又引用了A,導(dǎo)致出現(xiàn)了循環(huán)引用異常,下面來(lái)介紹如何避免循環(huán)引用異常,感興趣的朋友跟隨小編一起看看吧2022-12-12
python-pandas創(chuàng)建Series數(shù)據(jù)類(lèi)型的操作
這篇文章主要介紹了python-pandas創(chuàng)建Series數(shù)據(jù)類(lèi)型的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
實(shí)例講解Python的函數(shù)閉包使用中應(yīng)注意的問(wèn)題
這里我們來(lái)以實(shí)例講解Python的函數(shù)閉包使用中應(yīng)注意的問(wèn)題,主要針對(duì)閉包后新生成的變量來(lái)不及初始化而導(dǎo)致找不到變量的錯(cuò)誤出現(xiàn),需要的朋友可以參考下2016-06-06
python執(zhí)行精確的小數(shù)計(jì)算方法
今天小編就為大家分享一篇python執(zhí)行精確的小數(shù)計(jì)算方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
舉例講解Django中數(shù)據(jù)模型訪(fǎng)問(wèn)外鍵值的方法
這篇文章主要介紹了舉例講解Django中數(shù)據(jù)模型訪(fǎng)問(wèn)外鍵值的方法,Django是最具人氣的Python web開(kāi)發(fā)框架,需要的朋友可以參考下2015-07-07

