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模块之StringIO使用示例
Apr 08 Python
在Python的Django框架中使用通用视图的方法
Jul 21 Python
python处理html转义字符的方法详解
Jul 01 Python
python3实现字符串的全排列的方法(无重复字符)
Jul 07 Python
在python中,使用scatter绘制散点图的实例
Jul 03 Python
pybind11和numpy进行交互的方法
Jul 04 Python
python实现身份证实名认证的方法实例
Nov 08 Python
使用python绘制二维图形示例
Nov 22 Python
Pyspark获取并处理RDD数据代码实例
Mar 27 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
pycharm中选中一个单词替换所有重复单词的实现方法
Nov 17 Python
详解Python 3.10 中的新功能和变化
Apr 28 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
ThinkPHP写第一个模块应用
2012/02/20 PHP
php模拟post提交数据的方法
2015/02/12 PHP
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
ASP Json Parser修正版
2009/12/06 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
VUE+Element实现增删改查的示例源码
2020/11/23 Vue.js
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
Python、Javascript中的闭包比较
2015/02/04 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
基于python log取对数详解
2018/06/08 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
Django 自定义分页器的实现代码
2019/11/24 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
Python打印不合法的文件名
2020/07/31 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
生日宴会答谢词
2014/01/09 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android
vue实现简易音乐播放器
2022/08/14 Vue.js