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写的一个简单DNS服务器实例
Jun 04 Python
python实现在pickling的时候压缩的方法
Sep 25 Python
Python实例一个类背后发生了什么
Feb 09 Python
Python网络爬虫项目:内容提取器的定义
Oct 25 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
ubuntu安装sublime3并配置python3环境的方法
Mar 15 Python
Python 读写文件的操作代码
Sep 20 Python
在Python中os.fork()产生子进程的例子
Aug 08 Python
Python selenium页面加载慢超时的解决方案
Mar 18 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 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可逆加密解密算法实例代码
2014/01/21 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
Jquery事件的连接使用示例
2013/06/18 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
javascript实现拖动元素交换位置
2015/11/29 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
简单实现js选项卡切换效果
2016/02/03 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
python 默认参数问题的陷阱
2016/02/29 Python
使用Python写CUDA程序的方法
2017/03/27 Python
Python数据分析之如何利用pandas查询数据示例代码
2017/09/01 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
采购部岗位职责
2013/11/24 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
研发工程师岗位职责
2014/04/28 职场文书
启动仪式策划方案
2014/06/14 职场文书
增员口号大全
2014/06/18 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
财务部岗位职责范本
2015/04/14 职场文书
实习证明模板
2015/06/16 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android
win10拖拽文件时崩溃怎么解决?win10文件不能拖拽问题解决方法
2022/08/14 数码科技