2015-11-07 3 views
3

Я работаю с регулярным выражением Python для извлечения длительности времени в формате «2h30m». Я столкнулся с проблемой, когда группы, не захватывающие захват ((?:...)), становятся захваченными внутри названных групп.Группа, не захватывающая группу в названной группе

например. соответствие 2h30m против:

(?P<hours>\d+(?:h))?(?P<minutes>\d+(?:m))? 

будет соответствовать {'hours': '2h', 'minutes': '30m'}, а не 2 и 30.

Обойти бы использовать положительные LOOKAHEAD утверждения ((?=...)), но это не обновляет состояние регулярных выражений FSM, поэтому мы должны повторить h, m суффиксы:

(?P<hours>\d+(?=h))?h?(?P<minutes>\d+(?=m))?m? 

Есть ли лучший способ сделать это?

+0

являются '' h'and M' действительно необязательно? Регулярное выражение, которое может соответствовать пустой пустой строке, является плохой практикой. –

+0

Группы, не связанные с захватом, не «аннулируют» то, что они соответствуют, и удаляют из внешних групп; они всего лишь способ объединить вещи, чтобы вы могли применить к ним квантификаторы. – user2357112

+0

@stribizhev: Регулярное выражение должно совпадать '5h', '5m' и '5h5m' – megapctr

ответ

6

Группы, не связанные с захватом, не «аннулируют» то, что они соответствуют, и удаляют их из внешних групп. Это всего лишь способ объединить вещи, чтобы вы могли применить к ним квантификаторы.

Чтобы получить эффект, который вы хотите, вы можете изменить группы поставить, не захватив группы вне захвата групп:

(?:(?P<hours>\d+)h)?(?:(?P<minutes>\d+)m)? 
+0

Фантастический! Большое спасибо за быструю реакцию :) – megapctr

Смежные вопросы