python利用正则表达式提取字符串


Posted in Python onDecember 08, 2016

前言

正则表达式的基础知识就不说了,有兴趣的可以点击这里,提取一般分两种情况,一种是提取在文本中提取单个位置的字符串,另一种是提取连续多个位置的字符串。日志分析会遇到这种情况,下面我会分别讲一下对应的方法。

一、单个位置的字符串提取

这种情况我们可以使用(.+?)这个正则表达式来提取。 举例,一个字符串"a123b",如果我们想提取ab之间的值123,可以使用findall配合正则表达式,这样会返回一个包含所以符合情况的list。

代码如下:

import re
str = "a123b"
print re.findall(r"a(.+?)b",str)#
输出['123']

1.1贪婪和非贪婪匹配

如果我们有一个字符串”a123b456b”,如果我们想匹配a和最后一个b之间的所有值而非a和第一个出现的b之间的值,可以用?来控制正则贪婪和非贪婪匹配的情况。

代码如下:

import re
str = "a123b456b"

print re.findall(r"a(.+?)b", str)
#输出['123']#?控制只匹配0或1个,所以只会输出和最近的b之间的匹配情况

print re.findall(r"a(.+)b", str)
#输出['123b456']

print re.findall(r"a(.*)b", str)
#输出['123b456']

1.2多行匹配

如果你要多行匹配,那么需要加上re.S和re.M标志. 加上re.S后。将会匹配换行符,默认.不会匹配换行符。

代码如下:

str = "a23b\na34b"

re.findall(r"a(\d+)b.+a(\d+)b", str)
#输出[]
#因为不能处理str中间有\n换行的情况

re.findall(r"a(\d+)b.+a(\d+)b", str, re.S)
#s输出[('23', '34')]

加上re.M后,^$标志将会匹配每一行,默认^和$只会匹配第一行。

代码如下:

str = "a23b\na34b"

re.findall(r"^a(\d+)b", str)
#输出['23']

re.findall(r"^a(\d+)b", str, re.M)
#输出['23', '34']

二、连续多个位置的字符串提取

这种情况我们可以使用(?P<name>…)这个正则表达式来提取。举例,如果我们有一行webserver的access日志:'192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" "Mozilla/5.0"',我们想提取这行日志里面所有的内容,可以写多个(?P<name>expr)来提取,其中name可以更改为你为该位置字符串命名的变量,expr改成提取位置的正则即可。

代码如下:

import re
line ='192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" 
"Mozilla/5.0"'
reg = re.compile('^(?P<remote_ip>[^ ]*) (?P<date>[^ ]*) "(?P<request>[^"]*)" 
(?P<status>[^ ]*) (?P<size>[^ ]*) "(?P<referrer>[^"]*)" "(?P<user_agent>[^"]*)"')
regMatch = reg.match(line)
linebits = regMatch.groupdict()
print linebits
for k, v in linebits.items() :
 print k+": "+v

输出的结果为:

status: 200
referrer: 
request: GET /api HTTP/1.1
user_agent: Mozilla/5.0
date: 25/Oct/2012:14:46:34size: 44
remote_ip: 192.168.0.1

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python网页解析利器BeautifulSoup安装使用介绍
Mar 17 Python
python 线程的暂停, 恢复, 退出详解及实例
Dec 06 Python
python实现二叉树的遍历
Dec 11 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
彻彻底底地理解Python中的编码问题
Oct 15 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
Oct 21 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
Python生成一个迭代器的实操方法
Jun 18 Python
python Django中models进行模糊查询的示例
Jul 18 Python
Python及Pycharm安装方法图文教程
Aug 05 Python
python datetime中strptime用法详解
Aug 29 Python
基于python的七种经典排序算法(推荐)
Dec 08 #Python
Python序列操作之进阶篇
Dec 08 #Python
利用Python破解验证码实例详解
Dec 08 #Python
详解使用python crontab设置linux定时任务
Dec 08 #Python
Python 正则表达式入门(中级篇)
Dec 07 #Python
Python 正则表达式入门(初级篇)
Dec 07 #Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 #Python
You might like
php date与gmdate的获取日期的区别
2010/02/08 PHP
PHP APC缓存配置、使用详解
2014/03/06 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
js数组的操作详解
2013/03/27 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
2017/04/14 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
详解Vue SPA项目优化小记
2018/07/03 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
Js跳出两级循环方法代码实例
2020/09/22 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中字符串的修改及传参详解
2016/11/30 Python
Python探索之Metaclass初步了解
2017/10/28 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
tensorflow 模型权重导出实例
2020/01/24 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
会计电算化应届生求职信
2013/11/03 职场文书
大学新生军训方案
2014/05/03 职场文书
关于环保的标语
2014/06/13 职场文书
考试保密承诺书
2014/08/30 职场文书
作风转变心得体会
2014/09/02 职场文书
2015年父亲节寄语
2015/03/23 职场文书
刑事案件上诉状
2015/05/23 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技