Я работаю с регулярным выражением 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?
Есть ли лучший способ сделать это?
являются '' h'and M' действительно необязательно? Регулярное выражение, которое может соответствовать пустой пустой строке, является плохой практикой. –
Группы, не связанные с захватом, не «аннулируют» то, что они соответствуют, и удаляют из внешних групп; они всего лишь способ объединить вещи, чтобы вы могли применить к ним квантификаторы. – user2357112
@stribizhev: Регулярное выражение должно совпадать '5h', '5m' и '5h5m' – megapctr