Несколько групп Python RegEx
Я запутался, возвращая несколько групп в Python. Мой RegEx:
lun_q = 'Lun:\s*(\d+\s?)*'
И моя строка
s = '''Lun: 0 1 2 3 295 296 297 298'''`
Я возвращаю согласованный объект, а затем хочу посмотреть на группы, но все это показывает его последнее число (258):
r.groups()
(u'298',)
Почему он не возвращает группы из 0,1,2,3,4
и т.д.?
Ответы
Ответ 1
В вашем регулярном выражении содержится только одна пара круглых скобок (одна группа захвата), поэтому вы получаете только одну группу в своем матче. Если вы используете оператор повторения в группе захвата (+
или *
), группа получает "перезаписывается" каждый раз, когда группа повторяется, что означает, что только последнее совпадение выполнено.
В вашем примере здесь вам, вероятно, лучше использовать .split()
в сочетании с регулярным выражением:
lun_q = 'Lun:\s*(\d+(?:\s+\d+)*)'
s = '''Lun: 0 1 2 3 295 296 297 298'''
r = re.search(lun_q, s)
if r:
luns = r.group(1).split()
# optionally, also convert luns from strings to integers
luns = [int(lun) for lun in luns]
Ответ 2
Иногда его проще без регулярного выражения.
>>> s = '''Lun: 0 1 2 3 295 296 297 298'''
>>> if "Lun: " in s:
... items = s.replace("Lun: ","").split()
... for n in items:
... if n.isdigit():
... print n
...
0
1
2
3
295
296
297
298
Ответ 3
Другим подходом было бы использовать регулярное выражение, которое вы должны проверить ваши данные, а затем использовать более определенное регулярное выражение, предназначенное для каждого элемента, который вы хотите извлечь, используя итератор соответствия.
import re
s = '''Lun: 0 1 2 3 295 296 297 298'''
lun_validate_regex = re.compile(r'Lun:\s*((\d+)(\s\d+)*)')
match = lun_validate_regex.match(s)
if match:
token_regex = re.compile(r"\d{1,3}")
match_iterator = token_regex.finditer(match.group(1))
for token_match in match_iterator:
#do something brilliant
Ответ 4
Если вы ищете вывод, например, 0,1,2,3,4 и т.д.
Ниже приведен сингл answer.
print re.findall('\ d', s)