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中的ceil()方法使用教程
May 14 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
python实现名片管理系统
Nov 29 Python
pyqt 多窗口之间的相互调用方法
Jun 19 Python
基于pandas中expand的作用详解
Dec 17 Python
Python IDE环境之 新版Pycharm安装详细教程
Mar 05 Python
Python 3.8 新功能来一波(大部分人都不知道)
Mar 11 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
Feb 20 Python
Python Selenium异常处理的实例分析
Feb 28 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 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之curl实现http与https请求的方法
2014/10/21 PHP
PHP里的单例类写法实例
2015/06/25 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
php命令行写shell实例详解
2018/07/19 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
jquery validate使用攻略 第四步
2010/07/01 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
Jquery的Ajax技术使用方法
2019/01/21 jQuery
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
实例讲解Python中的私有属性
2014/08/21 Python
Python整型运算之布尔型、标准整型、长整型操作示例
2017/07/21 Python
20个常用Python运维库和模块
2018/02/12 Python
python交易记录链的实现过程详解
2019/07/03 Python
python框架django项目部署相关知识详解
2019/11/04 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
详解Python中的文件操作
2021/01/14 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
护理专业推荐信
2013/11/07 职场文书
酒店保洁主管岗位职责
2013/11/28 职场文书
最新的咖啡店创业计划书
2013/12/30 职场文书
二年级评语大全
2014/04/23 职场文书
英文感谢信格式
2015/01/21 职场文书
计划生育责任书
2015/05/09 职场文书
js Proxy的原理详解
2021/05/25 Javascript
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏