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模块顶层运行的代码引起的一个Bug
Jul 04 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
Scrapy的简单使用教程
Oct 24 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
Python入门之后再看点什么好?
Mar 05 Python
Python中max函数用于二维列表的实例
Apr 03 Python
python实现的MySQL增删改查操作实例小结
Dec 19 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
Jun 14 Python
Python Web框架之Django框架cookie和session用法分析
Aug 16 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
python使用多线程查询数据库的实现示例
Aug 17 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版自动生成文章摘要
2008/07/23 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
Jquery实现自定义tooltip示例代码
2014/02/12 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
JavaScript实现筛选数组
2021/03/02 Javascript
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
python对日志进行处理的实例代码
2018/10/06 Python
python打开windows应用程序的实例
2019/06/28 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
美国在线健康和美容市场:Pharmapacks
2018/12/05 全球购物
会展中心部门工作职责
2013/11/27 职场文书
物流管理专业职业生涯规划书
2014/01/06 职场文书
初三开学计划书
2014/04/27 职场文书
企业百日安全活动总结
2015/05/07 职场文书
摘录式读书笔记
2015/07/01 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS