[Python程序设计基础(第2版)][李东方 (10)[19页]
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创建正则表达式对象p:
p=re.compile('''[0-9a-zA-Z\_] #匹配1个数字、字母或下画线
Leabharlann Baidu
AA?
#后面跟A或 AA
(0*)$
#由若干个0结尾
''',re.I|re.X) #忽略大小写、忽略空格并允许当中整行加注释
10.2.1 匹配与搜索
匹配与搜索函数通常有match()、search()和findall(),它们的 作用和用法相似,通常有两种使用方法。 ① 作为正则表达式编译对象p的方法使用:
re.match(pattern, string[,flag]) re.search(pattern, string[,flag]) re.findall(pattern, string[,flag])
【例10-1】 假定某E-mail地址由三部分构成:英文字母或数字(1~10 个字符)、“@”、英文字母或数字(1~10个字符)、“.”,最后以com 或org结束,其正则表达式为:'^[a-zA-Z0-9]{1,10}@[a-zA-Z09]{1,10}.(com|org)$'。输入E-mail地址的测试字符串,忽略大小写, 输出判断是否符合设定规则。
正则表达式是用基本符号,以单个字符、字符集 合、字符范围、字符间的组合等形式组成模板, 然后用这个模板与所搜索的字符串进行匹配。
利用正则表达式对字符串的匹配通常分为精确匹 配和贪婪匹配两种。
表10-1 正则表达式的常见基本符号
10.1.1 精确匹配
在正则表达式中,如果直接给出字符,则为精确 匹配
第10章 正则表达式的应用
本章教学目标:
理解正则表达式的基本语法规则。 学会用re库的内置函数进行匹配、搜索、分组、 替换等字符串操作。 了解和体验简单爬虫自动获取网页资源的方法。
10.1 正则表达式
正则表达式(regular expression)是由一些特 定字符及其组合所组成的字符串表达式,用来对 目标字符串进行过滤操作。
10.2 re模块的内置函数
Python处理正则表达式的标准库是re re.compile()函数通常包括pattern(正则表达
式)和flag(匹配模式,可选)参数。
flag的常见取值如下: re.I:忽略大小写。 re.L:使用当前本地化语言字符集中定义的\w、\W、\b、\B、\s、\S(用于 多语言操作系统)。 re.M:多行模式,使'^'和'$'作用于每行的开始和结尾。 re.S:用'.'所匹配的任意字符包括换行符。 re.U:使用Unicode字符集中定义的\w、\W、\b、\B、\s、\S、\d、\D。 re.X:忽略空格,并允许用'#'添加注释。
10.1.2 贪婪匹配
贪婪匹配是一种尽可能多地匹配字符的匹配模式 贪婪匹配是正字表达式默认的匹配方式
当需要对数字字符串'6540000'进行匹配时,根据其以数字开头和若干 个0结尾的特点可写出正则表达式'^(\d+)(0*)$',但实际上该表达式 等效于'^(\d+)$',因为默认的贪婪匹配模式直接把后面的'0'作为数字 全部匹配了,对'6540123'照样可以匹配,无法精确表达以若干个0结 尾的含义。这时,必须用'?'使得'\d+'采用非贪婪匹配模式,并限定0 的位数,用正则表达式'^(\d+?)(0{4})$'才能把后面的'0'全部匹配出 来。
(1)数字和字符 用'\d'可以匹配一个数字,用'\w'可以匹配一个字符(包括数 字)。例如:
'11\d'可匹配'114',但不能匹配'11A' '\d\d\d'可匹配'021' '\w\w\d'可匹配'sp3'
(2)任意单个字符 用'.'可以匹配任意单个字符,例如:'py.'可以匹配'py2'、'py3'、'py!'等。 (3)多个字符 用'*'表示任意个字符(包括0个),用'+'表示至少1个字符,用'? '表示0个或1个字符,用 '{n}'表示n个字符,用'{n,m}'表示n-m个字符,例如,在正则表达式'd{3}\s+\d{3,8}'中, '\d{3}'匹配3位数字,'\s'匹配1个空格,而'\s+'表示至少有1个空格(包括制表位空格), '\d{3,8}'表示3~8位数字。这样,该正则表达式即可匹配带区号并以任意个空格隔开的电话 号码。 (4)字符范围 用'[]'表示字符范围,1组方括号只能表示1个字符,例如,'[0-9a-zA-Z\_]'可匹配1个数字、 字母或下画线。'P|p'可匹配'P'或'p','[P|p]ython'可匹配'Python'或'python'。 (5)开头和结尾 用'^'表示行的开头,用'^\d'表示必须以数字开头。用'$'表示行的结束,用'\d$'表示必须以数 字结束。例如,'py'可以匹配'python',但加上表示开头和结尾的符号,'^py$'就只能匹配整 行完整的'py',而对于'python'则无法匹配了。 (6)特殊字符 特殊字符通常指非字母、非数字字符。例如,换行符'\n'、回车符'\r'、空白符'\s'、制表位符 '\t'等。 为避免与语法表达式中符号的歧义,要用'\'转义或加r前缀统一转义。建议使用r前缀,就可以 不用考虑转义的问题了。 例如,常见的用'-'隔开区号的电话号码, 可用正则表达式'\d{3}\-\d{3,8}'或r'd{3}d{3,8}'匹配。 (7)汉字 匹配汉字的正则表达式为:' [\u4e00-\u9fa5] '。在支持Unicode编码的系统中,也可以直接 用汉字精确匹配
import re
p=re.compile('^[a-zA-Z0-9]{1,10}@[a-zA-Z0-9]{1,10}.(com|org)$',re.I)
p.match(string[,pos[endpos]]) p.search (string[,pos[endpos]]) p.findall(string[,pos[endpos]])
若非指定,则pos和endpos的默认值分别为0和len(string),即 从头到尾。 ② 不使用正则表达式编译对象而直接调用: