背景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等等,这些函数均可以提升咱们对文件内容的快速处理,节省时间。