一. search 与 matche函数
同样的正则表达式,match 打印的结果是空(没有匹配到结果); search打印的结果是match对象(匹配到了一个结果)
match 尝试从字符串的首字符开始匹配,如果match没有匹配相应的结果,将会返回一个空(None)
search 尝试搜索整个字符串,直到找到第一个满足正则表达式结果,然后将结果返回回来
#例子 1
import re
s = 'A84C73D28E67'
r = re.match('\d', s)
print(r)
r1 = re.search('\d', s)
print(r1)
#执行结果
$ python2.7 o11.py
None
Step 1.把字符串首字母去掉
import re
s = '84C73D28E67'
r = re.match('\d', s)
print(r)
r1 = re.search('\d', s)
print(r1)
# 执行结果
说明:match 和search 返回的结果都是match对象
$ python2.7 o11.py
Step 2.使用group方法获取match对象的结果
import re
s = '84C73D28E67'
r = re.match('\d', s)
print(r.group())
r1 = re.search('\d', s)
print(r1.group())
#执行结果
python2.7 o11.py
8
8
Step 3. match search 与 findall 的区别
从打印结果可以看到,match search 匹配到第一个满足正则表达式结果,然后将结果返回回来
findall 匹配整个字符串,将所以匹配的结果返回回来
import re
s = '84C73D28E67'
r = re.match('\d', s)
print(r.group())
r1 = re.search('\d', s)
print(r1.group())
r2 = re.findall('\d', s)
print(r2)
#执行结果
$ python2.7 o11.py
8
8
['8', '4', '7', '3', '2', '8', '6', '7']
二.group 组
Step 1. 取一段介于life 与 python之间的字符
例子1:使用life 和python 做定界; \w 可以匹配所有单词字符;可见打印结果报错,没有匹配到,\w只能匹配一个字符
例子2:\w* 匹配* 号前面字符0次或无限次,但打印结果仍然报错,这是因为s 字符串中有空格字符,而\w 只匹配单词字符,空格字符不在单词字符里面,所以匹配不到
例子3: . 匹配除换行符\n之外其他所有字符,当然也包括空格字符;成功打印介于life 与 python之间的字符;虽然是匹配到了 'life is short,i use python',要求是只获取'is short,i use' 这段字符
#例子 1
import re
s = 'life is short,i use python'
r = re.search('life\wpython', s)
print(r.group())
#执行结果
$ python2.7 o12.py
Traceback (most recent call last):
File "o12.py", line 6, in
print(r.group())
AttributeError: 'NoneType' object has no attribute 'group'
#例子 2
import re
s = 'life is short,i use python'
r = re.search('life\w*python', s)
print(r.group())
#执行结果
$ python2.7 o12.py
Traceback (most recent call last):
File "o12.py", line 6, in
print(r.group())
AttributeError: 'NoneType' object has no attribute 'group'
#例子3
import re
s = 'life is short,i use python'
r = re.search('life.*python', s)
print(r.group())
#执行结果
$ python2.7 o12.py
life is short,i use python
Step 2.1 group 组概念
group组的概念:
(
'life.*python'
, s) 看似目前没有对正则表达式进行分组,但实际上就是一个分组,只没有在外面加入小括号,因为只有一个分组,可以加小括号也可以不加,加了小括号的结果和不加小括号的结果是一样的(如例子1)
group函数的是可以传入一个参数的,这个参数就是指定要获取的组号,目前在这里只有一个组可以不传,默认组号是0
#例子1
import re
s = 'life is short,i use python'
r = re.search('(life.*python)', s)
print(r.group())
#执行结果
$ python2.7 o12.py
life is short,i use python
Step 2.2 group 组概念
例子1:把 .* 使用小括号括起来,取组号0;但返回的结果仍然是s 完整的字符串
group 0是比较特殊的情况,永远记录正则表达式完整匹配,若要匹配完整结果内部的某个分组的话,要从group 1开始访问
#例子1
import re
s = 'life is short,i use python'
r = re.search('life(.*)python', s)
print(r.group(0))
#执行结果
$ python2.7 o12.py
life is short,i use python
#例子2
import re
s = 'life is short,i use python'
r = re.search('life(.*)python', s)
print(r.group(1))
#执行结果
$ python2.7 o12.py
is short,i use
#例子4
#match search 对比 findall
说明:findall 会比match search 没那么复杂
import re
s = 'life is short,i use python'
r = re.findall('life(.*)python', s)
print(r)
#执行结果
$ python2.7 o12.py
[' is short,i use ']
Step 2.3 匹配多个组
groups 会返回正则表达式内的所有分组;
import re
s = 'life is short,i use python, hello world hello python '
r = re.search('life(.*)python(.*)python', s)
print(r.groups())
#执行结果
$ python2.7 o12.py
(' is short,i use ', ', hello world hello ')