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重新引入被覆盖的自带function
Jul 16 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
Python装饰器用法实例分析
Jan 14 Python
python 设置输出图像的像素大小方法
Jul 04 Python
详解Python self 参数
Aug 30 Python
python mqtt 客户端的实现代码实例
Sep 25 Python
numpy中三维数组中加入元素后的位置详解
Nov 28 Python
python 解决pycharm运行py文件只有unittest选项的问题
Sep 01 Python
Alpine安装Python3依赖出现的问题及解决方法
Dec 25 Python
pyspark对Mysql数据库进行读写的实现
Dec 30 Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 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生成静态文件的多种方法分享
2012/07/17 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
js用图作提交按钮或超连接
2008/03/26 Javascript
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
javascript 时间比较实现代码
2009/10/28 Javascript
JS实现切换标签页效果实例代码
2013/11/01 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
利用jquery操作Radio方法小结
2014/10/20 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
原生js开发的日历插件
2017/02/04 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
2017/11/07 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
Python中apply函数的用法实例教程
2014/07/31 Python
python检测远程服务器tcp端口的方法
2015/03/14 Python
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
Python中捕获键盘的方式详解
2019/03/28 Python
python 字典操作提取key,value的方法
2019/06/26 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
Python中itertools的用法详解
2020/02/07 Python
python开发前景如何
2020/06/11 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
如何使用amaze ui的分页样式封装一个通用的JS分页控件
2020/08/21 HTML / CSS
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
优秀学生自我鉴定范例
2013/12/18 职场文书
主题团日活动总结
2014/06/25 职场文书
老人与海读书笔记
2015/06/26 职场文书
Python实现socket库网络通信套接字
2021/06/04 Python