我有一个看起来像这样的字符串:
AB
我想使用如下所示的正则表达式捕获它:
(?P<GRP1>(A|D))?(?P<GRP2>(A|C))?B
是否有一个 python 函数可以为字符串生成两个匹配项?第一个是将
A
捕获为 GRP1
的一部分,第二个是将其捕获为 GRP2
? 的一部分
我尝试过像
re.fullmatch
和re.findall
这样的函数,但它们都只捕获A
作为GRP1
的一部分。
我正在寻找的功能在与
DB
或CB
匹配时会产生一场比赛,但AB
有两场比赛,每组一场比赛A
可以属于。
这不是正则表达式的设计目的。正则表达式是关于将输入范围与模式进行匹配。因此,输入的任何跨度要么匹配,要么不匹配。 span在这个过程中被“消耗”,即同一个span不能匹配pattern两次。另一方面,一个模式可以匹配多个不重叠的跨度,这就是
findall
的意义所在。
有一些高级正则表达式技术在匹配时不消耗任何字符(前瞻/后视),但那些本质上也不会捕获任何输入,这使它们对您无用。
通常这是一个人应该开始考虑不使用正则表达式或至少不使用only正则表达式的点。
我看到可能的解决方案
(?P<GRP1>(D))?(?P<GRP2>(C))?(?P<GRP1_2>(A))?B
即为可能发生的每一件事都有一个单独的组。 GRP1_2
代表 GRP1&GRP2 的情况。因此,例如,如果您的目标是计算 GRP1 和 GRP2 匹配项,那么您将同时计算 GRP1_2。肯定是的:
你可以使用前瞻:
(?=(?P<GRP1>(A|D)))(?=(?P<GRP2>(A|C)))\wB
这基本上是零宽度断言——这意味着它将捕获想要的组,但不会在实际匹配中占用空间。
我认为你正在寻找组匹配——组是基于“()”
import re
a = re.search('(.*)(.xlsx)', 'doc.xlsx')
print(a.group(1))
print(a.group(2))
这个例子会打印出来
doc
.xlsx