正则表达式:如何在以不同方式捕获组的同时多次匹配字符串

问题描述 投票:0回答:3

我有一个看起来像这样的字符串:

AB

我想使用如下所示的正则表达式捕获它:

(?P<GRP1>(A|D))?(?P<GRP2>(A|C))?B

是否有一个 python 函数可以为字符串生成两个匹配项?第一个是将

A
捕获为
GRP1
的一部分,第二个是将其捕获为
GRP2
?

的一部分

我尝试过像

re.fullmatch
re.findall
这样的函数,但它们都只捕获
A
作为
GRP1
的一部分。

我正在寻找的功能在与

DB
CB
匹配时会产生一场比赛,但
AB
有两场比赛,每组一场比赛
A
可以属于。

python regex regex-group
3个回答
0
投票

这不是正则表达式的设计目的。正则表达式是关于将输入范围与模式进行匹配。因此,输入的任何跨度要么匹配,要么不匹配。 span在这个过程中被“消耗”,即同一个span不能匹配pattern两次。另一方面,一个模式可以匹配多个不重叠的跨度,这就是

findall
的意义所在。

有一些高级正则表达式技术在匹配时不消耗任何字符(前瞻/后视),但那些本质上也不会捕获任何输入,这使它们对您无用。

通常这是一个人应该开始考虑不使用正则表达式或至少不使用only正则表达式的点。

我看到可能的解决方案

  1. 使用两个正则表达式模式,每个 GRP 一个。这将使整体结果成为一个代表 0-2 匹配的元组,代表无、GPR1、GPR2 或 GPR1+GPR2
  2. 使用一个正则表达式模式,但像这样重组它
    (?P<GRP1>(D))?(?P<GRP2>(C))?(?P<GRP1_2>(A))?B
    即为可能发生的每一件事都有一个单独的组。
    GRP1_2
    代表 GRP1&GRP2 的情况。因此,例如,如果您的目标是计算 GRP1 和 GRP2 匹配项,那么您将同时计算 GRP1_2。

0
投票

肯定是的:

你可以使用前瞻:

(?=(?P<GRP1>(A|D)))(?=(?P<GRP2>(A|C)))\wB

这基本上是零宽度断言——这意味着它将捕获想要的组,但不会在实际匹配中占用空间。

https://regex101.com/r/o1petz/1


0
投票

我认为你正在寻找组匹配——组是基于“()”

import re

a = re.search('(.*)(.xlsx)', 'doc.xlsx')

print(a.group(1))
print(a.group(2))

这个例子会打印出来

doc
.xlsx
© www.soinside.com 2019 - 2024. All rights reserved.