目录
第一部分:正则表达式模式创建
Regular Expression,需要导入re模块
一.模式创建
pattern = re.compile(r’…’)----括号中是要匹配的表达式,r’…'前面加r表示忽略转义,模式中写原始字符串即可。
二.匹配项规则
1.单字匹配
. ----匹配除\n以外的所有字符
\d ----匹配所有数字,等同于[0-9]
\D ----大写相当于取反,匹配所有非数字,等同于[^0-9]
\s -----所有空白字符,如\t \n \r \f \v等
\S----所有非空白字符
\w ----字母数字字符 [A-Za-z0-9]
\W ----非字母数字
2.批量备选:| ,yes|no----yes或no都可以
3.量词:
? ----0次或1次
* ----0次或多次
+ ----1次或多次
{3,5}或{3}----特定次数范围或次数
{n,}----至少n次
4.贪婪(默认)与非贪婪:
贪婪----尽量匹配最大范围结果
非贪婪----尽量匹配最小的范围结果,量词后追加?
例:<strong>.*?</strong>即为匹配<strong>与相邻的</strong>之间的任意数量任意字符。
5.边界匹配:
^----行首,$----行尾,\b----单词边界,\B非单词边界,\A----输入开头,\Z----输入结尾
第二部分:对正则表达式的操作
一.编译对象执行操作:
1.findall(要查找的对象)----查找所有非重叠匹配项,返回list列表类型;
2.match(要查找的对象,起点,终点)----仅从起始位置(默认开头)匹配,返回MatchObject;
3 .search(要查找的对象,起点,终点)----从某处(默认开头)任意搜索匹配,返回MatchObject;
4 .finditer(要查找的对象)----查找所有非重叠匹配项,返回包括MatchObject元素的迭代器;
二.几点注意:
1.match()的搜索规则是必须从首字母开始匹配,string如果包含pattern子串,则匹配成功,返回MatchObject,失败则返回None。即str = ‘abc’,pattern中正则表达式为’b’,则pattern.match(str)返回None,因为str中’b’并不是首位。
2.search()的搜索规则是可以从任意位置开始匹配,若string中包含pattern子串,则返回MatchObject,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个,即只能搜索到第一个匹配项。
3.finditer()返回string中所有与pattern相匹配的全部字串,返回形式为MatchObject的迭代器,即可以搜索多个匹配项。
4.findall()返回string中所有与pattern相匹配的全部字串,即可以搜索多个匹配项,但返回的形式是列表。
三.匹配对象MatchObject的操作
当返回结果为MatchObject类型时,查看结果需要调用MatchObject的方法。
1.常见方法
.group()----参数为0或空时,返回整个匹配;有参数时返回特定分组匹配细节
.groups()----返回包含所有子分组的元组
.start()----返回特定分组的起始索引
.end()----返回特定分组的终止索引
.span()----返回特定分组的起止索引
.groupdict()----以字典表形式返回分组名和结果
2.不同group方法的区别
首先要注意,group的方法都是MatchObject的方法,search()和match()返回的是MatchObject,而finditer()返回的是MatchObject为元素的迭代器,findall()返回的是列表,后两者都不能用group方法。
group()与group(0):返回的是匹配的字符串
groups():所有group组成的一个元组,group(1)是与patttern中第一个group匹配成功的子串,group(2)是第二个,依次类推,如果index超了边界,抛出IndexError;
注:匹配时有两种等价的写法
import re
s = '123abc78cd'
pattern = r'(\d*)([a-zA-Z]*)'
# 第一种 直接从re模块调用
m = re.match(pattern,s)
# 第二种 先生成一个模式
pattern_com = re.compile(pattern)
m = pattern_com.match(s)