1、常见正则表达式符号:
image.png
image.png
0[1-9]
电话号码:d{3}-d{3}-d{4}
d (.d*)?
2、re模块compile(pattern,flags=0)
image.png
image.png
3、例子
m=re.match('foo','foo')
if m is not None:
m.group()
4、match和search的区别
image.png
image.png
image.png
5、若要表达.号,用转义
image.png
6、电子邮件:w @(w .)?w .com
image.png
号:必须要有一个或以上
7、w d
image.png
8、一个()代表一个子组,m.group(1)获取第一个子组
image.png
m.groups() 则以列表形式列出所有子组
9、m.group 和m.groups区别
image.png
image.png
10、match只匹配开头,search匹配整行
11、findall返回list列表,如果是空值,返回空列表
image.png
12、函数后面有个re.I,代表忽略大小写
image.png
image.png
13、sub,替换后返回,调用方法re.sub
image.png
14、(?i)th :不区分大小写
image.png
15.(?s)让.号还能代表n,本来多个匹配,变成1个匹配
image.png
16、其他?
re.X
?....
re.P
?=
?=
image.png
17、实例
!/usr/bin/env python
import os import re
with os.popen('who','r') as f: for eachLine in f: print(re.split(r'ss |t',eachLine.strip())) 18、实例tasklist
image.png
19、re练习
正则表达式。按照练习1-1~1-12 的要求创建正则表达式。
1-1 识别后续的字符串:“bat”、“bit”、“but”、“hat”、“hit”或者“hut”。
1-2 匹配由单个空格分隔的任意单词对,也就是姓和名。
1-3 匹配由单个逗号和单个空白符分隔的任何单词和单个字母,如姓氏的首字母。
1-4 匹配所有有效Python 标识符的集合。
1-5 根据读者当地的格式,匹配街道地址(使你的正则表达式足够通用,来匹配任意数
量的街道单词,包括类型名称)。例如,美国街道地址使用如下格式:1180 Bordeaux
Drive。使你的正则表达式足够灵活,以支持多单词的街道名称,如3120 De la Cruz
Boulevard。
1-6 匹配以“www”起始且以“.com”结尾的简单Web 域名;例如,www://www. yahoo.com/。
选做题:你的正则表达式也可以支持其他高级域名,如.edu、.net 等(例如,
http://www.foothill.edu)。
1-7 匹配所有能够表示Python 整数的字符串集。
1-8 匹配所有能够表示Python 长整数的字符串集。
1-9 匹配所有能够表示Python 浮点数的字符串集。
1-10 匹配所有能够表示Python 复数的字符串集。
1-11 匹配所有能够表示有效电子邮件地址的集合(从一个宽松的正则表达式开始,然
后尝试使它尽可能严谨,不过要保持正确的功能)。
1-12 匹配所有能够表示有效的网站地址的集合(URL)(从一个宽松的正则表达式开始,
然后尝试使它尽可能严谨,不过要保持正确的功能)。
1-13 type()。内置函数type()返回一个类型对象,如下所示,该对象将表示为一个Pythonic
类型的字符串。
type(0) <type 'int'> type(.34) <type 'float'> type(dir) <type 'builtin_function_or_method'> 创建一个能够从字符串中提取实际类型名称的正则表达式。函数将对类似于<type 'int' >的字符串返回int(其他类型也是如此,如 'float' 、'builtin_function_or_method' 等)。 注意:你所实现的值将存入类和一些内置类型的name属性中。 1-14 处理日期。1.2 节提供了来匹配单个或者两个数字字符串的正则表达式模式,来表示1~ 9 的月份(0?[1-9])。创建一个正则表达式来表示标准日历中剩余三个月的数字。 1-15 处理信用卡号码。1.2 节还提供了一个能够匹配信用卡(CC)号码([0-9]{15,16}) 的正则表达式模式。然而,该模式不允许使用连字符来分割数字块。创建一个允 许使用连字符的正则表达式,但是仅能用于正确的位置。例如,15 位的信用卡号 码使用4-6-5 的模式,表明4 个数字-连字符-6 个数字-连字符-5 个数字;16 位的 信用卡号码使用4-4-4-4 的模式。记住,要对整个字符串进行合适的分组。选做题: 有一个判断信用卡号码是否有效的标准算法。编写一些代码,这些代码不但能够 识别具有正确格式的号码,而且能够识别有效的信用卡号码。 使用gendata.py。下面一组练习(1-16~1-27)专门处理由gendata.py 生成的数据。 在尝试练习1-17 和1-18 之前,读者需要先完成练习1-16 以及所有正则表达式。 1-16 为gendata.py 更新代码,使数据直接输出到redata.txt 而不是屏幕。 1-17 判断在redata.tex 中一周的每一天出现的次数(换句话说,读者也可以计算所选择 的年份中每个月中出现的次数)。 1-18 通过确认整数字段中的第一个整数匹配在每个输出行起始部分的时间戳,确保在 redata.txt 中没有数据损坏。 创建以下正则表达式。 1-19 提取每行中完整的时间戳。 1-20 提取每行中完整的电子邮件地址。 1-21 仅仅提取时间戳中的月份。 1-22 仅仅提取时间戳中的年份。 1-23 仅仅提取时间戳中的时间(HH:MM:SS)。 1-24 仅仅从电子邮件地址中提取登录名和域名(包括主域名和高级域名一起提取)。 1-25 仅仅从电子邮件地址中提取登录名和域名(包括主域名和高级域名)。 1-26 使用你的电子邮件地址替换每一行数据中的电子邮件地址。 1-27 从时间戳中提取月、日和年,然后以“月,日,年”的格式,每一行仅仅迭代一次。 处理电话号码。对于练习1-28 和1-29,回顾1.2 节介绍的正则表达式d{3}-d{3}-d{4}, 它匹配电话号码,但是允许可选的区号作为前缀。更新正则表达式,使它满足以下条件。 1-28 区号(三个整数集合中的第一部分和后面的连字符)是可选的,也就是说,正则 表达式应当匹配800-555-1212,也能匹配555-1212。 1-29 支持使用圆括号或者连字符连接的区号(更不用说是可选的内容);使正则表达式 匹配800-555-1212、555-1212 以及(800)555-1212。 正则表达式应用程序。下面练习在处理在线数据时生成了有用的应用程序脚本。 1-30 生成HTML。提供一个链接列表(以及可选的简短描述),无论用户通过命令 行方式提供、通过来自于其他脚本的输入,还是来自于数据库,都生成一个 Web 页面(.html),该页面包含作为超文本锚点的所有链接,它可以在Web 浏 览器中查看,允许用户单击这些链接,然后访问相应的站点。如果提供了简短 的描述,就使用该描述作为超文本而不是URL。 1-31 tweet 精简。有时候你想要查看由Twitter 用户发送到Twitter 服务的tweet 纯文本。 创建一个函数以获取tweet 和一个可选的“元”标记,该标记默认为False,然 后返回一个已精简过的tweet 字符串,即移除所有无关信息,例如,表示转推的 RT 符号、前导的“.”符号,以及所有#号标签。如果元标记为True,就返回一 个包含元数据的字典。这可以包含一个键“RT”,其相应的值是转推该消息的用 户的字符串元组和/或一个键“#号标签”(包含一个#号标签元组)。如果值不存 在(空元组),就不要为此创建一个键值条目。 1-32 亚马逊爬虫脚本。创建一个脚本,帮助你追踪你最喜欢的书,以及这些书在亚马 逊上的表现(或者能够追踪图书排名的任何其他的在线书店)。例如,亚马逊对于 任何一本图书提供以下链接:http://amazon.com/dp/ISBN(例如,http://amazon.com/ dp/0132678209)。读者可以改变域名,检查亚马逊在其他国家的站点上相同的图 书排名,例如德国(.de)、法国(.fr)、日本(.jp)、中国(.cn)和英国(.co.uk)。 使用正则表达式或者标记解析器,例如BeautifulSoup、lxml 或者html5lib 来解析 排名,然后让用户传入命令行参数,指明输出是否应当在一个纯文本中,也许包 含在一个电子邮件正文中,还是用于Web 的格式化HTML 中。