python regex repetition with capture question

╄→尐↘猪︶ㄣ 提交于 2019-12-02 02:29:11

问题


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

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()?


回答1:


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.




回答2:


This will match all the numbers before the dot:

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


来源:https://stackoverflow.com/questions/6673686/python-regex-repetition-with-capture-question

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!