2017-01-11 8 views
1

Это текст с разделителями, но я хочу его проанализировать w/regex.Python re.findall(), чтобы получить все сопоставленные группы

Вторая колонка и последующие секунды или миллисекунды.

>>> import re 
>>> s = '''aaa 
bbb|30s 
ccc|500ms|1s''' 
>>> re.findall(r'(\w+)(?:\|(\d+(?:s|ms)))?(?:\|(\d+(?:s|ms)))?', s) 

Выход (ожидаемый ответ):

[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')] 

Я хотел сделать эту модель короче, используя кванторы как * или {х, у}.

Так что я сделал:

>>> re.findall(r'(\w+)(?:(?:\|(\d+(?:s|ms)))*)', cmdstr) 

[('aaa', ''), ('bbb', '30s'), ('ccc', '500ms')] # WRONG 

мне не удалось.

Как это сделать с регулярным выражением?

ответ

1

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

Рассмотрите возможность просто делать s.split('|'), а затем любые проверки, которые необходимы для каждой из подстрок.

+0

У меня есть. Спасибо. – ijmo

0
import re 

s = '''aaa 
bbb|30s 
ccc|500ms|1s''' 

print(re.findall(r'(\w+)\|?(\w+)?\|?(\w+)?', s)) 

Выход:

[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')]