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通过字典dict判断指定键值是否存在的方法
Mar 21 Python
用Python的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
Python的time模块中的常用方法整理
Jun 18 Python
python追加元素到列表的方法
Jul 28 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
查看django执行的sql语句及消耗时间的两种方法
May 29 Python
实用自动化运维Python脚本分享
Jun 04 Python
用Python实现读写锁的示例代码
Nov 05 Python
python实现飞机大战游戏
Oct 26 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
python实现三次密码验证的示例
Apr 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中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
php 获取本地IP代码
2013/06/23 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
jquery 上下滚动广告
2009/06/17 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
vue2.0 和 animate.css的结合使用
2017/12/12 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
详解js加减乘除精确计算
2019/03/19 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
使用python绘制常用的图表
2016/08/27 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
python搜索算法原理及实例讲解
2020/11/18 Python
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
学校节能减排方案
2014/06/13 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
印刷技术专业自荐信
2014/09/18 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
Python读取和写入Excel数据
2022/04/20 Python
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技