组合多个正则表达式捕获组并获得第一个匹配

时间:2018-04-11 20:06:45

标签: regex python-3.x regex-group

我有多个组,我想在第一个匹配时拆分字符串,所以代码如下所示:

regex_patterns = (
    r"(?P<group1>345)",
    r"(?P<group2>123)",
)
p = re.compile("|".join(regex_patterns))
p.split("012345", maxsplit=1)

这将输出["0", "123", None, "45"],因此它会为None显示<group2>。有没有办法只使这个输出["0", "123", "45"](即忽略不匹配的组),以及哪个组匹配?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你想要所有的分裂没有None,你想知道哪个分组发生了分裂。从那和你的措辞,我只是假设只有一个组可以匹配。

要获取群组名称,您必须执行另一场比赛,因为re.split不会给您这样做。例如:

def custom_split(p, line):
    splits = re.split(p, line)

    match = re.search(p, line)
    for group, found in match.groupdict().items():
        if found is not None:
            return group, [s for s in splits if s is not None]

    return None, None

matched_group, splits = custom_split(p, "012345")

如果您不想匹配两次,则替代方法是仅执行re.search,然后使用匹配位置(使用match.start()len(found))进行拆分自己。

答案 1 :(得分:1)

如果它在捕获组中,则re.split可以保留分开的内容。

但是你的组合正则表达式包含多个命名的捕获组 因此,简化它并创建一个只有一个捕获组的组合正则表达式。

示例摘录

import re

regex_patterns = (
    '345',
    '123'
)

regex_combined_pattern = '('+ '|'.join(regex_patterns) +')'
print(regex_combined_pattern)

str = '012345603456'

result = re.split(regex_combined_pattern, str)
print(result)

<强>输出:

(345|123)
['0', '123', '4560', '345', '6']