用正则表达式查找文本模式
1.正则表达式,简称regex,Python中所有正则表达式的函数都在re模块中
\d 是一个正则表达式,表示一位数字字符,即任何一位0 到9 的数字。
2.在Python中使用正则表达式的步骤:
1)使用import re导入正则表达式模块
2)使用re.compile()函数创建一个regex对象(要使用原始字符串,因为正则表达式中通常包 含很多\,因此,某些转义字符会很麻烦,而在字符串前加r,使其变成原始字符串,就可以避免,原始字符串不包括转义字符)
3)向regex对象的search()方法传入向查找的字符串,它返回一个match对象
4)调用match对象的group方法,返回实际匹配文本的字符串
使用正则表达式匹配更多模式
1.利用括号分组
在正则表达式中加入括号进行分组,然后利用group方法和groups方法获得匹配的分组内容。
正则表达式中的第一对括号是第1组,以此类推。向group方法中传入整数1.。。。。。。就可以获取匹配文本的不同部分。
向group方法中传入整数0或者不传入参数,会获取整个匹配的文本。
想要一次获取所有分组的匹配文本,可以使用groups方法。因为groups方法返回多个值的元组,所以可以使用多重赋值的技巧,每个值赋值个一个独立的变量。
如果正则表达式中包括括号,可通过转义字符实现。
2.使用管道匹配多个分组
字符|称为“管道”。希望匹配许多表达式中的一个时,就可以使用它。
例如,正则表达式r'Batman|Tina Fey'将匹配'Batman'或'Tina Fey'。
如果Batman 和Tina Fey 都出现在被查找的字符串中,第一次出现的匹配文本,将作为Match 对象返回。
也可以使用管道匹配多个模式中的一个,作为正则表达式中的一部分。
如果需要匹配真正的管道字符,就用倒斜杠转义
3)使用问号实现可选匹配
字符?前面的分组表示可选,即问号前面的分组可出现零次或一次
要想匹配?,可在?前加转义字符\
正则表达式中的(wo)?和(\d\d\d-)?部分表明,模式wo 和\d\d\d-是可选的分组。该正则表达式匹配的文本中,wo 和\d\d\d-将出现零次或一次。
4)用星号匹配零次或多次
*(称为星号)意味着“匹配零次或多次”,即星号之前的分组,可以在文本中出现任意次。它可以完全不存在,或一次又一次地重复。
5)用加号匹配一次或多次
*意味着“匹配零次或多次”,+(加号)则意味着“匹配一次或多次”。星号不要求分组出现在匹配的字符串中,但加号不同,加号前面的分组必须“至少出现一次”。这不是可选的。
6)用花括号匹配特定次数
关于匹配次数:
花括号中是数字,表示匹配对应数字次数。如(ha){3}表示匹配字符串'hahaha',但不会匹配'haha'
指定范围,表示范围内的次数都是可选的。如(ha){3,5}可以匹配字符串'hahaha'、'hahahaha'、'hahahahaha'
也可以不写花括号中的第一个或第二个数字,不限定最小值或最大值。例如,(Ha){3,}将匹配3 次或更多次实例,(Ha){,5}将匹配0 到5 次实例
贪心和非贪心匹配
Python 的正则表达式默认是“贪心”的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。花括号的“非贪心”版本匹配尽可能最短的字符串,即在结束的花括号后跟着一个问号。
请注意,问号在正则表达式中可能有两种含义:声明非贪心匹配或表示可选的分组。这两种含义是完全无关的。
findall()方法
除了search 方法外,Regex 对象也有一个findall()方法。
search()将返回一个Match 对象,包含被查找字符串中的“第一次”匹配的文本,
findall()方法将返回一组字符串,包含被查找字符串中的所有匹配
findall()方法的返回结果:
1.如果调用在一个没有分组的正则表达式上,例如\d\d\d-\d\d\d-\d\d\d\d,方法findall()将返回一个匹配字符串的列表,例如['415-555-9999', '212-555-0000']。
2.如果调用在一个有分组的正则表达式上,例如(\d\d\d)-(\d\d\d)-(\d\d\d\d),方法findall()将返回一个字符串的元组的列表(每个分组对应一个字符串),例如[('415', '555', '1122'), ('212', '555', '0000')]。