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操作MySQL数据库具体方法
Oct 28 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
python+django加载静态网页模板解析
Dec 12 Python
python中的字典操作及字典函数
Jan 03 Python
python版学生管理系统
Jan 10 Python
Python中 传递值 和 传递引用 的区别解析
Feb 22 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
详解从Django Rest Framework响应中删除空字段
Jan 11 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 Python
matplotlib部件之套索Lasso的使用
Feb 24 Python
python基础详解之if循环语句
Apr 24 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 fread读取文件注意事项
2016/09/24 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
python遍历目录的方法小结
2016/04/28 Python
Python贪吃蛇游戏编写代码
2020/10/26 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
python实现感知器算法详解
2017/12/19 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
Python3实现打印任意宽度的菱形代码
2020/04/12 Python
IE下实现类似CSS3 text-shadow文字阴影的几种方法
2011/05/11 HTML / CSS
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
置业顾问岗位职责
2014/03/02 职场文书
2014年国培研修感言
2014/03/09 职场文书
给小学生的新年寄语
2014/04/04 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
岗位职责范本大全
2015/02/26 职场文书
就业意向书范本
2015/05/11 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL