re.findall为什么返回的元素会是个元素为元组的列表类型呢

问题起源:

如下案例:

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')]
发布了447 篇原创文章 · 获赞 153 · 访问量 49万+

猜你喜欢

转载自blog.csdn.net/ningyanggege/article/details/105254241