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 示例分享---逻辑推理编程解决八皇后
Jul 20 Python
探寻python多线程ctrl+c退出问题解决方案
Oct 23 Python
python爬虫实战之爬取京东商城实例教程
Apr 24 Python
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
Python算术运算符实例详解
May 31 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
利用pyinstaller将py文件打包为exe的方法
May 14 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
python matplotlib折线图样式实现过程
Nov 04 Python
python实现的分析并统计nginx日志数据功能示例
Dec 21 Python
python 检测nginx服务邮件报警的脚本
Dec 31 Python
django使用多个数据库的方法实例
Mar 04 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.ini 配置文件的深入解析
2013/06/17 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
vue-cli开发环境实现跨域请求的方法
2018/04/07 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
python同时给两个收件人发送邮件的方法
2015/04/30 Python
python实现在sqlite动态创建表的方法
2015/05/08 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
小学毕业感言150字
2014/02/05 职场文书
激励口号大全
2014/06/17 职场文书
学位证书委托书
2014/09/30 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
三八妇女节致辞
2015/07/31 职场文书
门面租赁合同范文
2019/08/06 职场文书
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js