Python使用re模块实现信息筛选的方法


Posted in Python onApril 29, 2018

本文实例讲述了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不仅仅提供了正则表达式的匹配,而且提供了一些批量处理的函数,比如splitsubsubn等等,这些函数都可以提高我们对文件内容的快速处理,节省时间。

Python 相关文章推荐
python利用elaphe制作二维条形码实现代码
May 25 Python
详解Python中time()方法的使用的教程
May 22 Python
windows下安装Python和pip终极图文教程
Mar 05 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
python判断设备是否联网的方法
Jun 29 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
python函数与方法的区别总结
Jun 23 Python
浅析matlab中imadjust函数
Feb 27 Python
python实现用户名密码校验
Mar 18 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
Python排序算法之选择排序定义与用法示例
Apr 29 #Python
Python实现的直接插入排序算法示例
Apr 29 #Python
Python实现的堆排序算法示例
Apr 29 #Python
Python中实现变量赋值传递时的引用和拷贝方法
Apr 29 #Python
分享一下Python数据分析常用的8款工具
Apr 29 #Python
Python随机函数random()使用方法小结
Apr 29 #Python
Python中py文件引用另一个py文件变量的方法
Apr 29 #Python
You might like
使用php 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
2011/03/25 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
Python 解析XML文件
2009/04/15 Python
爬山算法简介和Python实现实例
2014/04/26 Python
Python学习笔记之常用函数及说明
2014/05/23 Python
python模块之StringIO使用示例
2015/04/08 Python
Python中几种属性访问的区别与用法详解
2018/10/10 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
护理专业毕业生推荐信
2013/10/31 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
工程承包协议书
2014/04/22 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
离婚案件上诉状
2015/05/23 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript