Python for Informatics 第11章之正则表达式(四)


Posted in Python onApril 21, 2016

注:以下文章原文来自于Dr Charles Severance 的 《Python for Informatics》

11.3 组合查询和抽取

如果我们想以“X-”字符串开头的行中找到数字,就像下面两行字符串:

X-DSPAM-Confidence: 0.8475
X-DSPAM-Probability: 0.0000

但我们不只是要任意行中的任意浮点数,而是具备上面格式的行中的数字。

我们可以创建以下正则表达式来选择这样的行:

^X-.*: [0-9.]+

这个表达式的含义是以“X-”两个字符开头,后面跟了任意个字符“.*",接着是一个冒号":"和空格" ",在空格之后呢是一个及以上的数字或小数点“[0-9.]+”。大家要注意的是方括号中的"[.]"不是匹配任何字符,而是匹配真正的".",这与方括号外的"."要予以区分。

这是一个非常紧凑的表达式,它将非常匹配我们感兴趣的行:

import re
hand = open('mobx-short.txt')
for line in hand:
line = line.rstrip()
if re.search('^X-.*: [0-9.]+', line)
print(line)

当我们运行这个程序,我们可以看到我们想要的数据被完美的过滤显示。

X-DSPAM-Confidence: 0.8475
X-DSPAM-Probability: 0.0000
X-DSPAM-Confidence: 0.6178
X-DSPAM-Probability: 0.0000

但是我们必须使用split解决提取数字的问题。然而当这个问题简单到能用split解决时,我们可以使用正则表达式的另一特点,一步达到查找和解析功能。

圆括号()是正则表达式中的另一特殊字符。当我们添加圆括号至表达式中,在字符串的匹配过程中它们将被忽略,但是当你使用findall()时,圆括号表示你想整个正则表达式被匹配,但是你只抽取位于圆括号内你感兴趣的那部分字符串。

所以我们对程序修改如下:

import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
x = re.findall('^X-.*: ([0-9.]+)', line)
if len(x) > 0 :
print(x)

我们在正则表达式中对匹配浮点数字部分添加圆括号,并且用findall()代替search(),返回我们想要的浮点数字部分。这个程序的输出如下:

['0.8475']
['0.0000']
['0.6178']
['0.0000']
['0.6961']
['0.0000']
..

虽然这些在列表中的数字还需要从字符串转换为浮点数,但是我们应用正则表达式的能力同时查找和抽取了我们感兴趣的的信息。

下面是使用这个技巧的另一个案例。如果你查看文件,你会发现有许多行是这样的格式:

Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39772

如果我们想用同样的技巧抽取所有修订号(行末尾的整数),我们可以这样编写代码:

import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
x = re.findall('^Details:.*rev=([0-9]+)', line)
if len(x) > 0 :
print(x)

我们的正则表达式的是这样的,以"Details:"开头,之后可以是任意字符”.*",然后是"rev=",最后是一个以上的数字。我们希望行是匹配整个正则表达式,但我们只需要圆括号中"[0-9]+"的数字。当我们运行程序时,将得到以下输出:

['39772']
['39771']
['39770']
['39769']
...

记住,"[0-9]+"是贪婪的,它将尝试抽取任何可能的数字,所以我们得到的每个字符串都有五个数字。正则表达式库在行的开头和结尾两个方向进行扩展,只到它数到一个非数字的字符。

我们可以用正则表达式重做本书先前的一个练习。在这个练习中我们对每个邮件的时间感兴趣,我们寻找的行的格式如下:

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

并且我们想抽取每一行中日期中的小时信息。先前我们通过两次调用split实现。第一次我们将行分离成单词,然后我们对第五个单词基于冒号再次分离,拉出我们感兴趣的两个字符。

假定要查找的行是良好格式化的,那么只要想到少的代码就可以实现。但是当你为确保程序中碰到不具备这样格式而失效,而添加必要的错误检验(或者一个try/except块)时,这个代码将会膨胀到10-15行,并且难以读懂。

我们可以用下面的正则表达式使工作更简单:

^From .* [0-9][0-9]:

这个表达式的含义是以"From "开头(注意空格),然后跟着任意个字符".*",接着又是一个空格,然后是两个数字"[0-9][0-9]",再接着是一个冒号。我们要找的就是具备这样格式的行。

为了在findall中只抽出表示小时的两位数字,我们将表达式修改如下:

^From .* ([0-9][0-9]):

 最后这个程序是这样的:

import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
x = re.findall('ˆFrom .* ([0-9][0-9]):', line)
if len(x) > 0 : 
print(x)

程序运行结果如下:

['09']
['18']
['16']
['15']
...

相关阅读:

关于Python for Informatics 第11章之正则表达式(四)就给大家介绍到这里,希望对大家有所帮助。后续还会持续更新,更多精彩内容敬请关注!

Python 相关文章推荐
浅谈python和C语言混编的几种方式(推荐)
Sep 27 Python
Python中的上下文管理器和with语句的使用
Apr 17 Python
Tensorflow卷积神经网络实例
May 24 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 Python
python pandas时序处理相关功能详解
Jul 03 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
Python3标准库之threading进程中管理并发操作方法
Mar 30 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
如何把python项目部署到linux服务器
Aug 26 Python
Python自然语言处理之切分算法详解
Apr 25 Python
python如何将mat文件转为png
Jul 15 Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 #Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 #Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
Apr 20 #Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
Apr 20 #Python
Python实现HTTP协议下的文件下载方法总结
Apr 20 #Python
详解Python命令行解析工具Argparse
Apr 20 #Python
利用Python如何生成随机密码
Apr 20 #Python
You might like
PHP获取服务器端信息的方法
2014/11/28 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
Angular2使用Angular-CLI快速搭建工程(二)
2017/05/21 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
类如何去实现接口
2013/12/19 面试题
解除合同协议书
2014/04/17 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
入党综合考察材料
2014/06/02 职场文书
幼儿老师求职信
2014/06/30 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
普通员工辞职信范文
2015/05/12 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
2019秋季运动会口号
2019/06/25 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
java实现对Hadoop的操作
2021/07/01 Java/Android
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js