Python中如何通过正则表达式获取分组的所有匹配结果?
问题根源
正则中(two\s|three\s|four\s)*是被*量词修饰的重复捕获组,Python标准库re对这类分组仅会存储最后一次匹配的内容,之前匹配到的two 会被后续匹配到的four 覆盖,因此调用group(1)只能拿到单个结果。
实现方案
直接使用re.findall()扫描全串,提取所有符合规则的匹配项即可,无需写外层包裹的全串匹配逻辑,代码如下:
import re myStr = "one two four five" myPattern = r'two\s|three\s|four\s' res = re.findall(myPattern, myStr) print(res)
运行输出为['two ', 'four '],和预期结果一致。
如果需要保留原正则的上下文校验规则(即目标项前为单词+空格、后接单词),可以通过零宽断言做上下文判断,不会消耗字符影响后续匹配:
import re myStr = "one two four five" # 零宽断言校验前后文,不占用匹配字符 myPattern = r'(?<=\w\s)(two\s|three\s|four\s)(?=\w)' res = re.findall(myPattern, myStr) print(res)
re.findall()会遍历整个字符串,返回所有不重叠的匹配结果:如果正则没有捕获组,就返回完整匹配的子串;如果存在捕获组,就返回所有捕获组的匹配内容,天然适配“获取分组所有匹配结果”的需求。
内容的提问来源于stack exchange,提问作者lorakis
相关产品推荐
相关产品推荐

