Python for Informatics 第11章 正则表达式三(译)
注:文章原文为Dr. Charles Severance 的 《Python for Informatics》。文中代码用3.4版改写,并在本机测试通过。
11.2 用正则表达式抽取数据
在Python中,我们可以使用findall()方法从字符串中抽取所有匹配正则表达式的子字符串。接下来我们会用一个例子,从行中抽取看起来像电子邮件地址的字符串,而不考虑行的格式。比如,我们想从下面几行字符串中拉出电子邮件地址。
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Return-Path: <postmaster@collab.sakaiproject.org>
for <source@collab.sakaiproject.org>;
Received: (from apache@localhost)
Author: stephen.marquard@uct.ac.za
但我们又不想为每一行编写不同的代码来分离、切片字符串。下面的程序用findall()找到包含电子邮件地址的行,然后从每一行中抽取一个或者更多的地址。
import re
s = 'Hello from csev@umich.edu to cwen@iupui.edu about the meeting @2PM'
lst = re.findall('\S+@\S+', s)
print(lst)
findall()方法查找它的第二参数s并返回所有类似电子邮件地址的字符串。这里我们用了两个字符序列"\S"来匹配非空白字符。其输出将会是:
['csev@umich.edu', 'cwen@iupui.edu']
这个正则表达式表明我们正在查找这样一个字符串:由一个以上非空白字符开头,紧跟着@符,然后再跟着一个以上非空白字符的字符串。而且,“\S"表达式将匹配所有的非空字符(这在正则表达式中被叫做”贪婪的“)。
这个正则表达式将两次匹配到符合要求的字符串(cesv@umich.edu 和 cwen@iupui.edu),但它不会匹配”@2PM“,因为这个字符串的@符之前没有非空白字符。我们可以在程序中利用这个正则表达式读取文件的所有行,并打印出任何看起来像电子邮件地址的字符串:
import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
x = re.findall('\S+@\S+', line)
if len(x) > 0 :
print(x)
我们读取每一行,然后抽取所有匹配这个正则表达式的字符串。因为findall()返回的是一个列表,所以我们只要检查这个列表的元素个数是否大于零就可判断并打印出至少一个以上的邮件地址。如果我们运行这个程序,将会得到以下输出:
['wagnermr@iupui.edu']
['cwen@iupui.edu']
['<postmaster@collab.sakaiproject.org>']
['<200801032122.m03LMFo4005148@nakamura.uits.iupui.edu>']
['<source@collab.sakaiproject.org>;']
['<source@collab.sakaiproject.org>;']
['<source@collab.sakaiproject.org>;']
['apache@localhost)']
['source@collab.sakaiproject.org;']
输出的有些电子邮件地址的开头或结尾有一些不正确的字符像"<"或";"。而我们声明只对以字母或数字开头,以字母结尾的字符串感兴趣。
为做到这一点,我们使用另一特性的正则表达式。方括号被用来表示多个可接受字符的集合。在一定程度上,"\S"是要求匹配非空白字符,现在我们需要更加清楚的匹配规则。
下面是我们新的正则表达式:
[a-zA-Z0-9]\S*@\S*[a-zA-Z]
这个表达式变得有点复杂,这让你明白为什么对正则表达式而言,它拥有自己的语言。这个表达式表示我们要找的字符串是这样的:以字母(大小写均可)或数字开头的,接着是任意个非空白字符,可以是零个,中间是@符,接下来又是非空白字符,最后是字母结尾。其中[a-z]和[A-Z]分别表示26个大小写字母,[0-9]表示10个数字,"\S*"表示任意个非空白字符。这里用星号代替加号,是因为方括号内已有一个字符。记住,星号和加号只应用于其紧邻的左侧字符。
如果我们在程序中使用这个正则表达式,我们获得的数据将更加干净:
import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
x = re.findall('[a-zA-Z0-9]\S*@\S*[a-zA-Z', line)
if len(x) > 0 :
print(x)
['wagnermr@iupui.edu']
['cwen@iupui.edu']
['postmaster@collab.sakaiproject.org']
['200801032122.m03LMFo4005148@nakamura.uits.iupui.edu']
['source@collab.sakaiproject.org']
['source@collab.sakaiproject.org']
['source@collab.sakaiproject.org']
['apache@localhost']
请注意“source@collab.sakaiproject.org”这几行,我们的新表达式消除了其尾部的">;"两个字符。这是因为我们的表达式添加[a-zA-Z]后,要求正则表达式的解析器找到的字符串必须以字母结尾,所以它就简单的停在了"g"上,而剔除了">;"。
同时需要注意的是,程序输出的是Python的列表,列表中的每个元素都是字符串。
Python for Informatics 第11章 正则表达式三(译)的更多相关文章
- Python for Informatics 第11章 正则表达式五(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.4 转义字符 之前我们在正 ...
- Python for Informatics 第11章 正则表达式六(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.7 调试 Python有一 ...
- Python for Informatics 第11章 正则表达式四(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.3 组合查询和抽取 如果我 ...
- Python for Informatics 第11章 正则表达式二(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.1 正则表达式的字符匹配 ...
- Python for Informatics 第11章 正则表达式一(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 目前为止,我们一直在通读文件,查 ...
- 《Python学习手册 第五版》 -第11章 赋值、表达式和打印
上一章对Python的语句和语法已经进行了基本的说明,接下来就是每个章节的详细说明,本章的主要内容就是标题中涵盖的三点:赋值语句.表达式语句.打印语句 本章重点内容如下: 1.赋值语句 1)赋值语句的 ...
- 路飞学城—Python爬虫实战密训班 第三章
路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...
- Python for Infomatics 第12章 网络编程三(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.5 HTML分析和网页抓取 ...
- python中关于正则表达式三
2015年8月14日 11:10 7.2正则表达式操作 正则表达式使用反斜杠字符'\'来暗示一些特殊的形式或者允许特殊的字符使用但是没有调用它们特殊的意思.在字符串常量中的相同目标的字符的python ...
随机推荐
- MVC – 15.路由机制
15.1.路由检测插件 - RouteDebug 15.2.路由约束 15.3.命名路由 15.4.验证码 15.5.ASP.NET MVC 与 三层架构 15.6.Area区域 15.6.1.尝试将 ...
- 以16进制打印出一块内存buff
如下代码(支持windows与Linux)会以[16进制][每行16字节]打印出一块内存的内容: void PrintBuffer(void* pBuff, unsigned int nLen) { ...
- apache lucene solr 官网历史版本下载地址
官网上一般只提供最新版本的下载,下面两个链接为所有历史版本的下载地址: lucene地址:archive.apache.org/dist/lucene/java/ solr地址:archive.apa ...
- Android在listview添加checkbox实现单选多选操作问题(转)
转自:http://yangshen998.iteye.com/blog/1310183 在Android某些开发需求当中,有时候需要在listveiw中加入checkbox实现单选,多选操作.表面上 ...
- HDU 5213 Lucky 莫队+容斥
Lucky Problem Description WLD is always very lucky.His secret is a lucky number K.k is a fixed odd n ...
- OGNL表示式使用和值栈
另外值得参考博客:http://blog.csdn.net/resigshy/article/details/7560573 OGNL是Object Graphic Navigation Langua ...
- LoadRunner常用事务判断
一.数据值比较 lr_start_transaction("终审") if (atoi(lr_eval_string("{MyOutputParm}"))==a ...
- Spring事务解析2-标签解析
根据自定义标签的使用规则,可以知道会执行AnnotationDrivenBeanDefinitionParser的parse @Override public BeanDefinition parse ...
- 《DSP using MATLAB》示例Example5.1
终于看到第5章了,继续努力,加油!!! 代码: xn = [0, 1, 2, 3]; N =4; Xk = dfs(xn,N) 用到的dfs函数: function [Xk] = dfs(xn,N) ...
- Codeforces Round #342 (Div. 2)
贪心 A - Guest From the Past 先买塑料和先买玻璃两者取最大值 #include <bits/stdc++.h> typedef long long ll; int ...