用Python中的re做信息篩選


背景

平時工作中,我們經常會處理大量的元數據(Raw Data),而一般的文件編輯器只能一次查詢一個關鍵字,這就難以連續的分析元數據,比如分析產品日志文件(log),日志可能包括很多information級別的信息,這些一般是我們不太關心的,我們主要關心的是一些特殊的調試(Debug)級別的信息,所以就有必要根據很多關鍵字篩選出來日志文件中我們所關系的信息,這樣篩選出來的日志文件不僅具有連續性,而且易讀性會非常好。

解決方案

re是Python自帶的正則表達式庫文件,為字符串的匹配篩選提供了極大的便利,本文就是利用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 "<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會掃描全目標字符串進行正則表達式匹配。

>>> 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中還有很多其他的函數可供大家使用,大家可以去查閱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等等,這些函數都可以提高我們對文件內容的快速處理,節省時間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM