背景python
平時工做中,咱們常常會處理大量的元數據(Raw Data),而通常的文件編輯器只能一次查詢一個關鍵字,這就難以連續的分析元數據,好比分析產品日誌文件(log),日誌可能包括不少information級別的信息,這些通常是咱們不太關心的,咱們主要關心的是一些特殊的調試(Debug)級別的信息,因此就有必要根據不少關鍵字篩選出來日誌文件中咱們所關係的信息,這樣篩選出來的日誌文件不只具備連續性,並且易讀性會很是好。正則表達式
解決方案編輯器
re是Python自帶的正則表達式庫文件,爲字符串的匹配篩選提供了極大的便利,本文就是利用re來進行日誌文件的信息篩選。首先,簡單來看一下re中的主要函數:函數
1. Compile(pattern, flag):對正則表達式進行編譯,比檢查語法的正確性。flag是編譯的標籤,這裏只介紹DOTALL,表示匹配全部的字符,包括新的行。spa
>>> 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」不符合正則表達式規則,因此返回None;第二個目標字符串能夠正常匹配輸出匹配對象(起始位置,匹配內容),因爲match每次都從目標字符串的開頭進行匹配,因此若是有匹配字符串,其開始位置始終爲0.日誌
3. search:與match功能相近,search會掃描全目標字符串進行正則表達式匹配。code
>>> import re >>> test = re.compile('[abc]+') >>> test.search('dabc') <_sre.SRE_Match object; span=(1, 4), match='abc'> >>>
這時用search就能夠匹配a,b,c開頭的字符串了orm
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中還有不少其餘的函數可供你們使用,你們能夠去查閱python官方文檔。
其次,介紹幾個正則表達式經常使用的符號:
1. *: 表示匹配其前面字符0或屢次
2. .: 表示匹配新行以外的全部字符
3. |: 表示或操做
4. +:表示匹配其前面緊鄰字符一次或屢次
5. ?: 表示匹配0或1次
其餘的正則表達式的表示也可去官網文檔查看。
最後,上一下這個簡單的篩選程序:
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不單單提供了正則表達式的匹配,並且提供了一些批量處理的函數,好比split,sub,subn等等,這些函數均可以提升咱們對文件內容的快速處理,節省時間。