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

问题起源:

如下案例:

s1 = "(\d)([a-zA-Z])"
s2 = "ddd.111kkkk6666lll"
import re
re.findall(s1,s2)

输出结果:
[('1', 'k'), ('6', 'l')]
这里就很奇怪,为什么会有这样的结果呢?
我所预期的是:["1k","6l"]

通过搜索强调findall的特性如下:

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')]

 

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值