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中的map、reduce和filter浅析
Apr 26 Python
Python减少循环层次和缩进的技巧分析
Mar 15 Python
通过python+selenium3实现浏览器刷简书文章阅读量
Dec 26 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
Python 给某个文件名添加时间戳的方法
Oct 16 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
Python实现转换图片背景颜色代码
Apr 30 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
python dict乱码如何解决
Jun 07 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 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面向对象编程快速入门
2006/12/14 PHP
php面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
PHP 检查扩展库或函数是否可用的代码
2010/04/06 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
jquery中ajax学习笔记3
2011/10/16 Javascript
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
小结Python的反射机制
2020/09/28 Python
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
ktv收银员岗位职责
2013/12/16 职场文书
房屋出售协议书
2014/04/10 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
企业宣传语大全
2015/07/13 职场文书
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python
SQLServer中exists和except用法介绍
2021/12/04 SQL Server
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js