背景
平時工作中,我們經常會處理大量的元資料(raw data),而一般的檔案編輯器只能一次查詢乙個關鍵字,這就難以連續的分析元資料,比如分析產品日誌檔案(log),日誌可能包括很多informa級別的資訊,這些一般是我們不太關心的,我們主要關心的是一些特殊的除錯(debug)級別的資訊,所以就有必要根據很多關鍵字程式設計客棧篩選出來日誌檔案中我們所關係的資訊,這樣篩選出來的日誌檔案不僅具有連續性,而且易讀性會非常好。
解決方案
re是python自帶的正規表示式庫檔案,為字元程式設計客棧串的匹配篩選提供了www.cppcns.com極大的便利,本文就是利用re來進行日誌檔案的資訊篩選。首先,簡單來看一下re中的主要函式:
1.compile(pattern, flag):對正規表示式進行編譯,比檢查語法的正確性。flag是編譯的標籤,這裡只介紹dotall,表示匹配所有的字元,包括新的行。
>>> import re
>>> re.compile('[abc]+')
re.compile('[abc]+')
>>> re.compile(test)
traceback (most recent call last):
file "", line 1, in
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," match="babc">
test是乙個以a或b或c開頭的正規表示式編譯物件,而match是從目標字串的開頭進行匹配,所以第乙個目標字串「dabc」不符合正規表示式規則,所以返回none;第www.cppcns.com二個目標字串可以正常匹配輸出匹配物件(起始位置,匹配內容),由於match每次都從目標字串的開頭進行匹配,所以如果有匹配字串,其開始位置始終為0.
3.search:與match功能相近,search會掃瞄全目標字串進行正規表示式匹配。
>>> import re
>>> test = re.compile('[abc]+')
>>> test.search('dabc')
<_sre.sre_match object span="(1," match="abc">
>>>
這時用search就可以匹配a,b,c開頭的字串了
4.findall:找出目標字串中所有的匹配字串,並以列表的形式返回
>>> test = re.compile('\[email protected]')
>>> test.findall(r"[email protected]@[email protected]")
['[email protected]', '[email protected]']
當然,re中還有很多其他的函式可供大家使用,大家可以去查閱python官方文件。
其次,介紹幾個正規表示式常用的符號:
1.*: 表示匹配其前面字元0或多次
2..: 表示匹配新行之外的所有字元
3.|: 表示或操作
4.+:表示匹配其前面緊鄰字元一次或多次
5.?: 表示匹配0或1次
其他的正規表示式的表示也可去官網文件檢視。
最後,上一下這個簡單的篩選程式:
import re
source = 'gcm.txt'
target = 'g2s.txt'
#一級篩選
raw_compile = re.compile(r"",re.dotall)
#二級篩選
messagelevel_compile = re.compile(r"
程式很簡單,在篩選的過程中大家可以先分析一下篩選的級別,可以逐級篩選。
總結:re不僅僅提供了正規表示式的匹配,而且提供了一些批量處理的函式,比如split,sub,subn等等,這些函式都可以提高我們對檔案內容的快速處理,節省時間。
ps:這裡再為大家提供2款非常方便的正規表示式工具供大家參考使用:
j**ascript正規表示式**測試工具:
正規表示式**生成工具:
python模組 re模組
匹配任意字元 匹配指定字元類別 字元開頭 字元結尾 取非字元 重複多次字元 0次或多次 重複多次字元 1次或多次 重複單次字元 左右表示式任意匹配 重複m到n次字元 重複m次字元 d 匹配任何十進位制數,相當於 0 9 d 匹配任何非數字字元,相當於 0 9 s 匹配任何空白字元,相當於 fdss ...
re模組使用
import re strdata python is the best language in the world match只能匹配以 開頭的子符串,第乙個引數是正則,第二個引數是需要匹配的字串 res re.match p strdata,re.i re.i引數表示忽略大小寫 res re.m...
RE模組使用
i mport reli re.match d 12821j128j312893j129 match方法,先使用正規表示式,然後傳入待查字串 print li 結果物件 sre.sre match object span 0,5 match 12821 ifli print li.group 獲得資...