简体   繁体   中英

Capturing multiple optional groups in a regex both repeating and non repeating

I have to match an expression similar to these

STAR 13

STAR 13, 23

STAR 1, 2 and 3 and STAR 1

But only capture the digits. The number of digits is unspecified.

I've tried with STAR(?:\\s*(?:,|and)\\s*(#\\d+))+ But it doesn't seem to capture the terms exactly. No other dependencies could be added. Just the re module only.

The problem is a much larger one where STAR is another regular expression which has already been solved. Please don't bother about it and just consider it as a letter combination. Just include the letters STAR in regular expressions.

If you don't know the number of the digit r'[0-9]+' to specifie 1 digit or more. And to capture all number, you can use : r'(\\d+)'

Do it with one regex:

re.findall("STAR ([0-9]+),? ?([0-9]+)? ?a?n?d? ?([0-9]+)?",a)

[('13', '', '')]

[('13', '23', '')]

[('1', '2', '3'), ('1', '', '')]

May be esaier and cleaner resultut with two step, first you need to have variable in a list like that:

tab = ["STAR 13","STAR 13, 23","STAR 1, 2 and 3 and STAR 1"]

list = filter(lambda x: re.match("^STAR",x),tab)
list_star = filter(lambda x: re.match("^STAR",x),tab)
for i in list_star:
    re.findall(r'\d+', i)

['13']

['13', '23']

['1', '2', '3', '1']

You just need to put it in a new list after that my_digit += re.findall(r'\\d+', i)

In 1 line:

import functools
tab = ["STAR 13","STAR 13, 23","STAR 1, 2 and 3 and STAR 1"]
digit=functools.reduce(lambda x,y: x+re.findall("\d+",y),filter(lambda x: re.match("^STAR ",x),tab),[])

['13', '13', '23', '1', '2', '3', '1']

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM