5

我有一个像这样的正则表达式'^(a|ab|1|2)+$',想得到这个的所有序列......

例如对于 re.search(reg, 'ab1') 我想得到 ('ab','1')

我可以用'^(a|ab|1|2)(a|ab|1|2)$'模式得到等效的结果,但我不知道有多少块与 (pattern)+ 匹配

这是可能的,如果是的话 - 如何?

4

3 回答 3

4

尝试这个:

import re
r = re.compile('(ab|a|1|2)')
for i in r.findall('ab1'):
    print i

ab选项已移至第一个,因此它将ab匹配a. findall 方法多次匹配您的正则表达式并返回匹配组的列表。在这个简单的示例中,您将只返回一个字符串列表。每个字符串进行一次匹配。如果您有更多组,您将返回一个元组列表,每个元组都包含每个组的字符串。

这应该适用于您的第二个示例:

pattern = '(7325189|7325|9087|087|18)'
str = '7325189087'
res = re.compile(pattern).findall(str)
print(pattern, str, res, [i for i in res])

我正在^$从模式中删除符号,因为如果 findall 必须找到多个子字符串,那么它应该搜索 str 中的任何位置。然后我删除+了它,所以它匹配模式中这些选项的单个出现。

于 2013-08-04T17:30:40.957 回答
3

您的原始表达式确实与您想要的方式匹配,它只匹配整个字符串,并且不会为每个单独的匹配捕获单独的组。使用重复运算符('+'、'*'、'{m,n}'),每次都会覆盖组,并且只保存最终匹配。文档中提到了这一点:

如果一个组匹配多次,则只能访问最后一个匹配项。

于 2013-08-04T21:15:51.097 回答
2

我认为你不需要正则表达式来解决这个问题,你需要一些递归图搜索功能

于 2013-08-06T05:23:41.750 回答