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访问抓取网页常用命令总结
Apr 11 Python
解决python3在anaconda下安装caffe失败的问题
Jun 15 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
python 读取文本文件的行数据,文件.splitlines()的方法
Jul 12 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
Aug 04 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
Apr 26 Python
Python如何将字符串转换为日期
Jul 31 Python
python之openpyxl模块的安装和基本用法(excel管理)
Feb 03 Python
教你使用pyinstaller打包Python教程
May 27 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/06 PHP
php使用百度天气接口示例
2014/04/22 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
laravel请求参数校验方法
2019/10/10 PHP
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
jQuery设置和移除文本框默认值的方法
2015/03/09 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
Async Validator 异步验证使用说明
2017/07/03 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
Parcel.js + Vue 2.x 极速零配置打包体验教程
2017/12/24 Javascript
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
2020/06/01 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
python进阶教程之动态类型详解
2014/08/30 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
Django自带的加密算法及加密模块详解
2019/12/03 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
我未来的职业规划范文
2014/01/11 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
聘任书的格式及模板
2019/10/28 职场文书
浅谈如何提高PHP代码的质量
2021/05/28 PHP