首页 > 解决方案 > 获取与 findall 匹配的所有捕获组

问题描述

嗨,我需要一个正则表达式来捕获与文本匹配的所有组

我有以下文字

"abc"

和这个正则表达式

compiled = re.compile("(?P<group1>abc)|(?P<group2>abc)")
compiled.findall("asd")

但输出如下:

("abc", "")

我期望的输出如下

("abc", "abc") # one match per capturing group that matches

编辑:

我需要达到的目标

我有大约 500 组事物,我想将文本分类到这些组中的每一个,所以我创建了一个捕获组,每个组都有一个正则表达式。这样我可以运行一次大的正则表达式,并获取匹配组的索引以知道哪个组匹配

例如,我有甜点的配料,想知道一个文本可能属于哪些甜点:

test = re.compile('(?P<dessert1>(?:apple))|(?P<dessert2>(?:apple|banana))|(?P<others>(?:other))')

那么如果我有字符串

apple

我想获得组“desert1”和“desert2”出于性能原因,我不能为每个甜点运行多个正则表达式

标签: pythonregex

解决方案


您可以对其中一个捕获组使用积极的前瞻

(?=(?P<group1>abc))(?P<group2>\1)

正则表达式演示| Python 演示

import re
 
regex = r"(?=(?P<group1>abc))(?P<group2>(?P=group1))"
test_str = "abc"
print(re.findall(regex, test_str))

输出

[('abc', 'abc')]

或者更明确地代替反向引用\1,用于(?P=group1)匹配与捕获组命名相同的文本group1

(?=(?P<group1>abc))(?P<group2>(?P=group1))

正则表达式演示


推荐阅读