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