核心函数和方法
- compile 模块函数,对正则表达式进行预编译
- match
- search
- group、groups
compile
python 的代码最终会被编译为字节码,然后才会被解释器执行,比如 eval 或者 exec 调用的代码对象,在性能上会明显提升。
这个概念也适用于正则表达式,在模式匹配前,正则表达模式先被编译成 regex 对象,由于正则表达式一般会进行多次比较,所以强烈建议先对它进行预编译。
re.compile()
就是用来提供编译功能的。
match
re.match()
函数尝试从字符串的开头开始对模式进行匹配,如果匹配成功,就返回一个匹配对象;如果匹配失败,就返回 None。
m = re.match('foo', 'foo')
if m is not None:
print(m.group())
>>> foo
从示例中可以看出,foo
完全匹配,所以 m
是一个匹配对象的实例,当匹配失败时,返回一个 None
m = re.match('foo', 'bar')
print(m.group())
>>> Traceback (most recent call last):
AttributeError: 'NoneType' object has no attribute 'group'
由于 None 并不是一个匹配对象,没有 group()
方法,所以抛出 AttributeError
异常,因此在第一个示例中 if m is not None
就是用来规避由于匹配失败报错的。
匹配对象和 group()、groups()
通过上面例子,我们初步认识了匹配对象,在处理正则表达式时,match() 或 search() 被成功调用之后所返回的结果,就是匹配对象。
匹配对象有两个主要方法:group() 和 groups()。
group() 方法返回所有匹配对象,或者根据要求返回某个特定子组。
groups() 方法返回一个包含唯一或者所有子组的元组
如果正则表达式中没有子组的话,groups 将返回一个空元组,而 group 仍会返回全部匹配对象。
search
search 与 match 工作方式一样,不同之处在于 search 会检查参数字符串任意位置的地方,而不是从起始处去匹配。严格的说,search() 是从左到右进行搜索。
# 使用 match 匹配失败
m = re.match('foo', 'seafood')
if m is not None: print(m.group())
>>>
# 使用 search 匹配成功
m = re.search('foo', 'seafood')
if m is not None: print(m.group())
>>> foo
正则匹配示例
匹配多个字符串(|)
管道符号代表逻辑或的意思
p = 'happy|test|demo'
# 匹配成功
m = re.match(p, 'test')
if m is not None: print(m.group())
>>> test
# 匹配失败
m = re.match(p, 'iamok')
if m is not None: print(m.group())
>>>
# search 匹配成功
m = re.search(p, 'python demo')
if m is not None: print(m.group())
>>> demo
匹配任意单个字符(.)
p = '.end'
print(re.match(p, 'bend').group())
>>> 'bend'
print(re.match(p, 'end').group()) # 未匹配
>>> AttributeError ...
print(re.match(p, '\nend').group()) # 不匹配 \n
>>>
print(re.match(p, 'The end').group())
>>> ' end'
p1 = '3.14'
p2 = '3\.14'
print(re.match(p1, '3.14').group())
>>> 3.14
print(re.match(p1, '3514').group()) # p1 匹配成功
>>> 3514
print(re.match(p2, '3514').group()) # p2 匹配失败
>>> AttributeError ...
创建字符合集([])
print(re.match('[ab][12][cd][34]', 'a1c3').group())
>>> 'a1c3'
print(re.match('[ab][12][cd][34]', 'b2c4').group())
>>> 'b2c4'
print(re.match('ab12|cd34', 'b2c4').group())
>>> AttributeError ...
注意字符集合与 |
不一样。
重复、特殊字符和子组
453