python的和分组

时间:2025-02-11 13:48:07

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

发现输出只有分组的部分。

先来看看searchgroup

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

这样就符合需求了。