Python使用re模塊實現(xiàn)信息篩選的方法
本文實例講述了Python使用re模塊實現(xiàn)信息篩選的方法。分享給大家供大家參考,具體如下:
背景
平時工作中,我們經(jīng)常會處理大量的元數(shù)據(jù)(Raw Data),而一般的文件編輯器只能一次查詢一個關鍵字,這就難以連續(xù)的分析元數(shù)據(jù),比如分析產(chǎn)品日志文件(log),日志可能包括很多information級別的信息,這些一般是我們不太關心的,我們主要關心的是一些特殊的調試(Debug)級別的信息,所以就有必要根據(jù)很多關鍵字篩選出來日志文件中我們所關系的信息,這樣篩選出來的日志文件不僅具有連續(xù)性,而且易讀性會非常好。
解決方案
re是Python自帶的正則表達式庫文件,為字符串的匹配篩選提供了極大的便利,本文就是利用re來進行日志文件的信息篩選。首先,簡單來看一下re中的主要函數(shù):
1. Compile(pattern, flag):對正則表達式進行編譯,比檢查語法的正確性。flag是編譯的標簽,這里只介紹DOTALL,表示匹配所有的字符,包括新的行。
>>> import re
>>> re.compile('[abc]+')
re.compile('[abc]+')
>>> re.compile(test)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'test' is not defined
>>>
2. match(): 從目標字符串的開頭來判斷是否與正則表達式匹配,如果不匹配返回None,反之,返回匹配對象,包括起始位置,結束位置,字符串內容
>>> import re
>>> test = re.compile('[abc]+')
>>> test.match('dabc')
>>> test.match('babc')
<_sre.SRE_Match object; span=(0, 4), match='babc'>
test是一個以a或b或c開頭的正則表達式編譯對象,而match是從目標字符串的開頭進行匹配,所以第一個目標字符串“dabc”不符合正則表達式規(guī)則,所以返回None;第二個目標字符串可以正常匹配輸出匹配對象(起始位置,匹配內容),由于match每次都從目標字符串的開頭進行匹配,所以如果有匹配字符串,其開始位置始終為0.
3. search:與match功能相近,search會掃描全目標字符串進行正則表達式匹配。
>>> import re
>>> test = re.compile('[abc]+')
>>> test.search('dabc')
<_sre.SRE_Match object; span=(1, 4), match='abc'>
>>>
這時用search就可以匹配a,b,c開頭的字符串了
4. findall:找出目標字符串中所有的匹配字符串,并以列表的形式返回
>>> test = re.compile('\w+@163.com')
>>> test.findall(r"alvin@163.comtest1234@163.comnotvalid@gmail.com")
['alvin@163.com', 'test1234@163.com']
當然,re中還有很多其他的函數(shù)可供大家使用,大家可以去查閱python官方文檔。
其次,介紹幾個正則表達式常用的符號:
1. *: 表示匹配其前面字符0或多次
2. .: 表示匹配新行之外的所有字符
3. |: 表示或操作
4. +:表示匹配其前面緊鄰字符一次或多次
5. ?: 表示匹配0或1次
其他的正則表達式的表示也可去官網(wǎng)文檔查看。
最后,上一下這個簡單的篩選程序:
import re
source = 'GCM.txt'
target = 'g2s.txt'
#一級篩選
raw_compile = re.compile(r"<g2s:g2sMessage.*?</g2s:g2sMessage>",re.DOTALL)
#二級篩選
messagelevel_compile = re.compile(r"<igtLicensing.*|<g2s:idReader.*",re.DOTALL)
#二級篩選
egmlevel_compile = re.compile(r"IGT_00012E2335AA.*",re.DOTALL)
def FilterG2SMessage():
fr = open(source)
content = fr.read()
fr.close()
f = open(target,'w')
g2sItems = raw_compile.findall(content)
for g2s in g2sItems:
iscaredG2S = messagelevel_compile.search(g2s)
isCaredEGM = egmlevel_compile.search(g2s)
if iscaredG2S and isCaredEGM:
f.write(g2s+'\n')
else:
pass
f.close()
FilterG2SMessage()
程序很簡單,在篩選的過程中大家可以先分析一下篩選的級別,可以逐級篩選。
總結:
re不僅僅提供了正則表達式的匹配,而且提供了一些批量處理的函數(shù),比如split,sub,subn等等,這些函數(shù)都可以提高我們對文件內容的快速處理,節(jié)省時間。
PS:這里再為大家提供2款非常方便的正則表達式工具供大家參考使用:
JavaScript正則表達式在線測試工具:
http://tools.jb51.net/regex/javascript
正則表達式在線生成工具:
http://tools.jb51.net/regex/create_reg
更多關于Python相關內容可查看本站專題:《Python正則表達式用法總結》、《Python數(shù)據(jù)結構與算法教程》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設計有所幫助。
相關文章
Python通過字典映射函數(shù)實現(xiàn)switch
這篇文章主要介紹了Python通過字典映射函數(shù)實現(xiàn)switch,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11
使用python實現(xiàn)將excel數(shù)據(jù)導入word并設置字體樣式的代碼示例
在日常辦公和數(shù)據(jù)處理中,我們經(jīng)常需要將Excel中的數(shù)據(jù)導入到Word文檔中,手動完成這個過程可能既費時又容易出錯,本文將介紹如何使用Python自動化這一任務,需要的朋友可以參考下2024-02-02
python2.7無法使用pip的解決方法(安裝easy_install)
下面小編就為大家分享一篇python2.7無法使用pip的解決方法(安裝easy_install),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04

