首页 > 解决方案 > Python 正则表达式 findall 函数仅返回组匹配而不是完整字符串

问题描述

给定字符串bcacaca。正则表达式模式b?(.a)*应该匹配整个字符串。但是,调用会re.findall('b?(.a)*', 'bcacaca')返回['ca', '']结果。它似乎只返回单个组的匹配结果。这里发生了什么?

我的理解findall是它应该返回正则表达式模式的所有非重叠实例。在这种情况下,它应该返回['bcacaca', '']

标签: pythonregex

解决方案


改为'(b(.a)*)'用作您的正则表达式模式。您需要result[0]在以下示例中。

import re

result = re.findall('(b(.a)*)', 'bcacaca')
result

输出

[('bcacaca', 'ca')]

更好的选择 - 使用非捕获组

正如@Nick 提到的,可以在此处使用非捕获组,如下所示。考虑以下场景。有关分步说明,请参阅下一节。另外,我鼓励您使用此资源:regex101.com

## Define text and pattern
text = 'bcacaca dcaca dbcaca'
pattern = 'b?(?:.a)*'

## Evaluate regex
result = re.findall(pattern, text)
# output
# ['bcacaca', '', '', 'caca', '', '', 'bcaca', '']

## Drop empty strings from result
result = list(filter(None, result))
# output
# ['bcacaca', 'caca', 'bcaca']

使用非捕获组说明

在此处输入图像描述

参考

  1. 从字符串列表中删除空字符串

推荐阅读