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 ...
随机推荐
- Android中shell命令语句
最近学习了Android中碰到了shell命令,故收集终结了一下 Ccat zdd 浏览文件zdd的内容cat zdd1 zdd2 浏览多个文件的内容cat -n zdd浏览文件zdd的内容并显示行号 ...
- iOS - 线程管理
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- sshd_conf AllowUsers参数
AllowUsers root user1 user2 #服务器只允许root user1 user2登录,再的新也用户产生,是不允许豋录服务器 配置文件在/etc/ssh/sshd_confing ...
- Memcached驱动(C#)
using Memcached.ClientLibrary; using System; using System.Collections.Generic; using System.IO; usin ...
- python多线程之Condition(条件变量)
#!/usr/bin/env python # -*- coding: utf-8 -*- from threading import Thread, Condition import time it ...
- [LeetCode] Length of Last Word
Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...
- 禁用编译器自动生成的函数(Effective C++之06)
如果想让你的类定义出来的对象是独一无二的,即对象无法被复制,或者使用赋值操作符赋给另外一个对象,那么最好的方法就是禁用拷贝构造函数和赋值操作符.下面介绍几种禁用的方法.(方法来自Effective C ...
- How to use the Visual Studio
推荐一个提供VS配色方案的一个网站:StudioStyles,域名和网站同名:http://studiostyl.es/ 2. 整行剪切:Ctrl + X.光标不要选中任何文字,然后按这个快捷键就可以 ...
- cocos2dx游戏开发——别踩白块学习笔记(一)——Block类
一.Block类介绍 当然啦,Block类在这个游戏里就是必需品= =,因为整体都是由这个搞出来的,所以我们可以把游戏需要实现的功能都放在这里. 主要有下面这些功能(经典模式): 1.创建一个Bloc ...
- 几种方式实现Javaweb页面跳转
背景: 自己经手的一个java项目要实现带参页面跳转和页面跳转,完成任务后,总结一下自己知道了的几种方式. 实现: 首先我们有两大种方式来实现页面跳转:1.JS(javascript):2 ...