RegEx с несколькими группами? - PullRequest
34 голосов
/ 11 февраля 2011

Я запутался, возвращая несколько групп в 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 и т. Д.? * 10101 *

Ответы [ 4 ]

27 голосов
/ 11 февраля 2011

Ваше регулярное выражение содержит только одну пару скобок (одна группа захвата), поэтому вы получаете только одну группу в вашем матче.Если вы используете оператор повторения в группе захвата (+ или *), группа «перезаписывается» при каждом повторении группы, что означает, что захватывается только последнее совпадение.

В вашемНапример, вам лучше использовать .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]
7 голосов
/ 11 февраля 2011

Иногда проще без регулярных выражений.

>>> 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
4 голосов
/ 11 февраля 2011

Другой подход заключается в использовании регулярного выражения, необходимого для проверки ваших данных, а затем в более конкретном регулярном выражении, предназначенном для каждого элемента, который вы хотите извлечь с помощью итератора совпадения.

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
0 голосов
/ 05 сентября 2017

Если вы ищете вывод , такой как 0,1,2,3,4 и т. Д. Ответ очень прост, см. Код ниже.

print re.findall ('\ d', s)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...