python正则表达式重复与捕获问题

时间:2011-07-13 03:17:35

标签: regex python-3.x capture repeat

使用python3的正则表达式功能,是否可以根据找到的重复次数捕获可变数量的捕获块?例如,在以下搜索字符串中,我想捕获具有相同正则表达式的所有数字字符串。

搜索字符串1(尝试捕获:89,45):

zzz89zzz45.mp3

搜索字符串2(尝试捕获:98,67,89,45):

zzz98zzz67zzz89zzz45.mp3

搜索字符串3(尝试捕获:98,67,89,45,55,111):

zzz98zzz67zzz89zzz45vdvd55lplp111.mp3

以下正则表达式将匹配所有重复,但所有值都不可供以后使用(仅捕获1位数字符串):

((\d+)\D*)*\.mp3$

其他两个选项是为每种情况编写不同的正则表达式,或使用findall()。有没有办法调整上面的正则表达式,以便捕获每个数字字符串,以便以后使用正则表达式使用各种重复次数,或者在python3中执行此操作,你是否被迫使用findall()?

2 个答案:

答案 0 :(得分:3)

这将匹配点之前的所有数字:

s = "zzz98zzz67zzz89zzz45vdvd55lplp111.mp3"
res = re.findall("[0-9]+(?=.*\\.)", s)
print(res)

答案 1 :(得分:3)

大多数或所有常用的正则表达式引擎,特别是那些基于PCRE语法(如Python)的正则表达式引擎,根据左括号的数字索引标记其捕获组,作为正则表达式写入< / em>的。所以不,你不能单独使用捕获组从字符串中提取任意数量的可变数量的子序列。

你能得到的最接近的(据我所知)是手动写出一定数量的捕获组,如下所示:

s = ...
res = re.match(r'\D*' + 25 * r'(\d+)\D+')
numbers = [r for r in res.groups() if r is not None]

这将为您提供最多25组数字。如果您需要更多,请将25替换为更高的数字。

如果我的效率低于使用findall()的迭代方法,我不会感到惊讶,尽管我还没有测试过它。