开发者

python regex repetition with capture question

using python3's regex capabilities, is it possible to capture variable numbers of capture blocks, based on the number of the repetitions found? for instance, in the following search strings, i want to capture all the digit strings with the same regex.

search string 1(trying to capture: 89, 45):

zzz89zzz45.mp3
开发者_JAVA百科

search string 2(trying to capture: 98, 67, 89, 45):

zzz98zzz67zzz89zzz45.mp3

search string 3(trying to capture: 98, 67, 89, 45, 55, 111):

zzz98zzz67zzz89zzz45vdvd55lplp111.mp3

the following regex will match all the repetitions, though all the values are not available for later use(only 1 digit string is captured):

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

the other 2 options are writing a different regex for every case, or use findall(). Is there a way to adjust the above regex in order to capture every digit string for later use with various numbers of repetitions using just regex facilities, or to do this in python3, are you forced to use findall()?


Most or all regular expression engines in common use, including in particular those based on the PCRE syntax (like Python's), label their capturing groups according to the numerical index of the opening parenthesis, as the regex is written. So no, you cannot use capturing groups alone to extract an arbitrary, variable number of subsequences from a string.

The closest you can get (as far as I know) is to manually write out a certain number of capturing groups, something like this:

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

This will get you up to 25 groups of digits. If you need more, replace 25 with some higher number.

I wouldn't be surprised if this were less efficient than the iterative approach with findall(), although I haven't tested it.


This will match all the numbers before the dot:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜