re.match函数只匹配字符串的开始字符,如果开始的字符不符合正则表达式,匹配就会失败,返回None。
re.search方法匹配整个字符串,直到找到一个匹配的对象,匹配结束没找到匹配值才返回None。
#! /usr/bin/evn python
#-*- coding:utf-8 -*-
import re
line='Cats are smarter than dogs'
matchObj=re.match(r'dogs',line,re.M|re.I)
if matchObj:
print('use match,the match string is:',matchObj.group())
else:
print('No match string!!')
matchObj=re.search(r'dogs',line,re.M|re.I)
if matchObj:
print('use search,the match string is:',matchObj.group())
else:
print('No search match string!!')
执行结果如下:
No match string!!
use search,the match string is: dogs
该示例中使用了match类中的分组方法——group。
该方法定义如下:
def group(self,*args):
"""Return one or more subgroups of the match.
:type:T|tuple
"""
pass
groups([group],···]):获得或多个分组截获的字符串,指定多个参数时,以元祖形式返回。group1可以使用编号,也可以使用别名。编号0代表整个匹配的子串。不填写参数时返回group(0);没有截获字符串时返回None;截获多次字符串的组时,返回最后一次截获的子串。
还有一个常用的分组方法groups。
groups([default]):以元组形式返回全部分组截获的字符串,相当于调用group(1,2,···;last)。
default表示没有截获字符串时以这个值代替,默认为None。
编译
当我们在Python中使用正则表达式时,re模块内部会做两件事情:
(1)编译正则表达式,如果正则表达式的字符串本身不合法,就会报错
(2)用编译后的正则表达式匹配字符串
如果一个正则表达式需要重复使用几千次,处于效率考虑,我们可以预编译该正则表达式,这样重复使用时就不需要便宜这个步骤了,直接匹配即可:
#! /usr/bin/python3
#-*- coding:utf-8 -*-
re_telephone=re.compile(r'^(\d{3})-(\d{3,8})$')
print(re_telephone.match('010-12345').groups())
print(re_telephone.match('010-8086').groups())
执行结果:
('010','12345')
('010','8086')