Python正则表达式findall函数只返回组上的匹配,而不是完整字符串

2024-06-26 14:28:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 实例字符串re模式情况cafindallbcacaca
1条回答
网友
1楼 · 发布于 2024-06-26 14:28:30

改用'(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']

使用非捕获组的说明

enter image description here

参考资料

  1. Remove empty strings from a list of strings

相关问题 更多 >