问题起源:
如下案例:
s1 = "(\d)([a-zA-Z])"
s2 = "ddd.111kkkk6666lll"
import re
re.findall(s1,s2)
输出结果:
[('1', 'k'), ('6', 'l')]
这里就很奇怪,为什么会有这样的结果呢?
我所预期的是:["1k","6l"]
通过搜索强调findall的特性如下:
findall()返回的是括号所匹配到的结果,多个括号就会返回多个括号分别匹配到的结果, 如果没有括号就返回就返回整条语句所匹配到的结果
所以设计三个实验来证明:
实验一:
s1 = "\d[a-zA-Z]"
s2 = "ddd.111kkkk6666lll"
import re
re.findall(s1,s2)
输出结果:
['1k', '6l']
实验二:
s1 = "(\d[a-zA-Z])"
s2 = "ddd.111kkkk6666lll"
import re
re.findall(s1,s2)
输出结果:
['1k', '6l']
实验三:
s1 = "((\d)([a-zA-Z]))"
s2 = "ddd.111kkkk6666lll"
import re
re.findall(s1,s2)
输出结果:
[('1k', '1', 'k'), ('6l', '6', 'l')]
实验已经证明,返回括号内的匹配结果,如果有多个括号就会用元组类型存储匹配多个匹配结果。如果没有括号等同于最外面加了个括号。
它和re.search有什么区别呢?
re.search仅返回匹配的第一个结果,而匹配回来的结果也可以用group的方法取括号中正则表达部分。主要的区别就是它只返回第一次匹配到的结果;
s1 = "(\d)([a-zA-Z]+)"
s2 = "ddd.111kkkk6666lll"
import re
ss = re.search(s1,s2)
print(ss.group(0))
print(ss.group(1))
print(ss.group(2))
print(re.findall(s1,s2))
预期结果:
1kkkk
1
kkkk
[('1', 'kkkk'), ('6', 'lll')]