findall
函数在re表达式有分组的情况下是一个坑。
findall
def main():
s = '12222222221.431451253252'
import re
# 我想匹配整个串
rgs = r'[0-9]+(\.[0-9]+)?'
p = re.compile(rgs)
rs = p.findall(s)
print(rs)
if __name__ == '__main__':
main()
['.431451253252']
发现输出只有分组的部分。
先来看看search
的group
def main():
s = '12222222221.431451253252'
import re
# 改了一下,有两个分组
rgs = r'([0-9]+)(\.[0-9]+)?'
p = re.compile(rgs)
rs = p.search(s)
print(rs.group(0))
print(rs.group(1))
print(rs.group(2))
print(rs.groups())
if __name__ == '__main__':
main()
12222222221.431451253252
12222222221
.431451253252
('12222222221', '.431451253252')
发现groups
函数返回的部分并没有group(0)
,即只有分组部分,没有整体匹配的结果。
再看看findall
处理多个分组的情况
def main():
s = '12222222221.431451253252'
import re
rgs = r'([0-9]+)(\.[0-9]+)?'
p = re.compile(rgs)
print(p.findall(s))
if __name__ == '__main__':
main()
[('12222222221', '.431451253252')]
总结和解决方式
看来findall
函数处理有分组的正则表达式的时候,会将匹配的结果采取类似groups
的方式处理,即只取分组部分,所以以后使用的时候要小心,如果需要全匹配,要将分组改为正则括号的非捕获版本
,即(?:...)
def main():
s = '12222222221.431451253252'
import re
rgs = r'[0-9]+(?:\.[0-9]+)?'
p = (rgs)
print((s))
if __name__ == '__main__':
main()
['12222222221.431451253252']
这样就符合需求了。