您的位置:首页 > 编程语言 > Python开发

python学习笔记(五)正则表达式的基本语法和re模块API

2017-11-23 09:14 603 查看
正则表达式语法

1,‘[ ]’字符集合设定符

由一对方括号括起来的字符,表明一个字符集合,能够匹配包含在其中的任意一个字符。比如[abc123],表明字符’a’‘b’
‘c’ ‘1’ ‘2’ ‘3’都符合它的要求。可以被匹配。
在’[‘‘]’中还可以通过 ’-‘减号来指定一个字符集合的范围,比如可以用[a-zA-Z]来指定所以英文字母的大小写,不可以把大小的顺序颠倒了。
如果在’[‘‘]’里面的开头写一个 ‘^’号,则表示取非,即在括号里的字符都不匹配。如[^a-zA-Z]表明不匹配所有英文字母。但是如果
‘^’不在开头,则它就不再是表示取非,而表示其本身,如[a-z^A-Z]表明匹配所有的英文字母和字符’^’。
 
2,‘|’或规则

将两个规则并列起来,以‘|’连接,表示只要满足其中之一就可以匹配。比如 

[a-zA-Z]|[0-9] 表示满足数字或字母就可以匹配,这个规则等价于[a-zA-Z0-9] 
其中(?:dog|cat)是一个无捕获组
3,无捕获组

       将一部分规则作为一个整体,对它进行特定的操作,如下是找dog或cat



执行结果如下:



4,‘.’匹配除\n以外的所有字符

如下:



运行结果如下:



‘^’和‘\A’匹配字符串首

‘$’和‘\Z’匹配字符串尾

‘\d’匹配数字‘\D’不匹配数字

‘\W’匹配字母和数字         等价于[a-zA-Z0-9]

‘\S’匹配间隔符              等价于[\t\r\n\f\v]

‘\b’匹配单词边界

‘\b’匹配一个单词的边界,比如空格等,不过它是一个‘0’长度字符,它匹配完的字符串不会包括那个分界的字符。

‘\s’匹配会匹配出的字符串中会包含那个分界符。

‘\B’匹配非边界



运行结果如下;



注意:bc的前后有空格
5,精确匹配和最小匹配

1. ‘{m}’精确匹配m次;‘{m,n}’匹配最少m次,最多n次。(n>m)
2.如果你只想指定一个最少次数或只指定一个最多次数,你可以把另外一个参数空起来。



运行结果:{3}并不是精确找出三位数,而是找出所有出现够三次的数,{1,4}并不是一位数到4位数,而是两位数到四位数



6,前向(非)界定与后向(非)界定

有时候需要匹配一个跟在特定内容后面的或者在特定内容前面的字符串,Python提供一个简便的前向界定和后向界定功能,或者叫前导指定和跟从指定功能。它们是: 
‘(?<=…)’ 前向界定 
括号中’…’代表你希望匹配的字符串的前面应该出现的字符串。 
‘(?=…)’ 后向界定 
括号中的’…’代表你希望匹配的字符串后面应该出现的字符串。
‘(?< !…)’前向非界定
只有当你希望的字符串前面不是’…’的内容时才匹配 

‘(?!…)’后向非界定 
只有当你希望的字符串后面不跟着’…’内容时才匹配。



运行结果:



7组

       7.1‘()’无命名组
      最基本的组是由一对圆括号括起来的正则式。
       7.2‘(?p…)命名组’
(?P’代表这是一个Python的语法扩展’<…>’里面是你给这个组起的名字,比如你可以给一个全部由数字组成的组叫做’num’,它的形式就是’(?P\d+)’
{’(?P<num>\d+)’吧}。起了名字之后,我们就可以在后面的正则式中通过名字调用这个组,它的形式是‘(?P=name)’
调用已匹配的命名组。
要注意,再次调用的这个组是已被匹配的组,也就是说它里面的内容是和前面命名组里的内容是一样的。 
s=’aaa111aaa,bbb222,333ccc,444ddd444,555eee666,fff777ggg’ 
我们看看下面的正则式会返回什么样的结果: 
re.findall( r’([a-z]+)\d+([a-z]+)’ , s ) #
找出中间夹有数字的字母 [(‘aaa’, ‘aaa’), (‘fff’, ‘ggg’)] 
re.findall( r ‘(?P[a-z]+)\d+(?P=g1)’ , s ) #找出被中间夹有数字的前后同样的字母 [‘aaa’] 
re.findall( r’[a-z]+(/d+)([a-z]+)’ , s ) #找出前面有字母引导,中间是数字,后面是字母的字符串中的中间的数字和后面的字母 [(‘111’,
‘aaa’), (‘777’, ‘ggg’)]
我们可以通过命名组的名字在后面调用已匹配的命名组,不过名字也不是必需的。
7.3‘\number’通过序号调用已匹配的组
正则式中(并不能使用在sub函数中)的每个组都有一个序号,序号是按组从左到右,从1开始的数字,你可以通过下面的形式来调用已匹配的组 
re.findall(r’([a-z]+)\d+\1’ , s ) 

[‘aaa’] 
结果是一样的。 
再看一个例子 

s=’111aaa222aaa111 , 333bbb444bb33’ 

re.findall( r’(\d+)([a-z]+)(\d+)(\2)(\1)’ , s ) #找出完全对称的数字-字母-数字-字母-数字中的数字和字母 

[(‘111’, ‘aaa’, ‘222’, ‘aaa’, ‘111’)]
Python正则库API及模式
re库API中,一般都有flags参数,通过该参数指定正则表达式选项。传递时一般使用简写,比如开启DOTALL和MULTILINE使用re.I|re.M



API:

re.compile(pattern, flags=0)                预编译一个正则表达式,返回一个表达式对象(Regular Expression Objects)
re.search(pattern, string, flags = 0)       在字符串中找匹配的串,返回第一个匹配到的匹配对象
re.match(pattern, string, flags=0)          从头开始匹配,返回匹配对象
re.split(pattern, string, maxsplit=0, flags=0)  使用pattern分割字符串,返回一个结果list
re.findall(pattern, string, flags=0)        search加强版,返回所有的匹配对象的list
re.finditer(pattern, string, flags=0)       返回一个迭代器,用户可以使用迭代器查看所有匹配对象
re.sub(pattern, repl, string, count=0, flags=0)  使用repl替换string中pattern匹配到的部分;
这里repl可以是一个函数,参数是匹配对象,返回要替代的串
re.subn(pattern, repl, string, count=0, flags=0) 类似sub,返回元组(new_string, number_of_subs_made)
re.escape(string)                           将所有的非字母数字字符前加"\"后返回
re.purge()                                  清空正则表达式缓存

表达式API(Regular Expression Objects)
flags                                       编译时的flag
groups                                      表达式中分组的数量
groupindex                                  以有别名的组别名为键、编号为值的字典
pattern                                     编译时用的表达式字符串
search(string[, pos[, endpos]])             从Pos处开始查找字符串,返回匹配对象
match(string[, pos[, endpos]])              从Pos处匹配字符串,返回匹配对象
split(string, maxsplit=0)                   同re.split
findall(string[, pos[, endpos]])            从Pos处查找所有匹配的字符串,返回所有匹配对象的list
finditer(string[, pos[, endpos]])           从Pos处查找所有的字符串,返回一个迭代器
sub(repl, string, count=0)                  同re.sub
subn(repl, string, count=0)                 同re.subn

匹配对象API(Match Objects)
pos                     传递给函数的pos
endpos                  传递给函数的endpos
lastindex               最后一个捕获的group的下标
lastgroup               最后一个捕获的group的名字
re                      调用match或者search的表达式对象
string                  match或者search的字符串
expand(template)        将匹配到的分组代入template中然后返回。template中可以使用\id或\g<id>、\g<name>引用分组
注意0不能使用,另外\10将被认为是第10个分组,如果你想表达\1之后是字符'0',只能使用\g<1>0。
group([group1, ...])    获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回,0代表整个匹配串
groups([default])       以元组形式返回全部分组截获的字符串,相当于调用group((1,2,…n))
groupdict([default])    返回以有别名的组的别名为键、以该组截获的子串为值的字典
start([group])          返回指定组的串在原串中的起始索引
end([group])            返回指定组的串在原串中的结束索引
span([group])           返回(start(group), end(group))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: