разделить строку по параметрам

Есть строка вида "1д1ч" или "1д1м", ну и тд. (если нет дней и часов, то обязательный параметр "м", тобишь минуты)

Как бы я мог это разделить на части?
Я подумал о регулярке split: ((.*)д)?((.*)ч)?(.*)м
Понятное дело, что делит оно неправильно... (['', '16д', '16', '1ч', '1', '1', '']).
Да и сейчас я понимаю, что в любом случае я не смогу понять в списке вида [1, 1] что к чему относится... Так что, прошу помощи.
Сразу благодарю за любую помощь.


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Используйте

^(?!$)(?:(?P<day>\d+)д)?(?:(?P<hour>\d+)ч)?(?:(?P<minute>\d+)м)?$

См. пример работы регулярного выражения. Подробности:

  • ^ - начало строки
  • (?!$) - тут же строка не должна заканчиваться
  • (?:(?P<day>\d+)д)? - необязательная незахватывающая подмаска: одна и более цифр, захватываемые в подмаску "day", а потом буква д
  • (?:(?P<hour>\d+)ч)? - необязательная незахватывающая подмаска: одна и более цифр, захватываемые в подмаску "hour", а потом буква ч
  • (?:(?P<minute>\d+)м)? - необязательная незахватывающая подмаска: одна и более цифр, захватываемые в подмаску "minute", а потом буква м
  • $ - конец строки

Пример использования в Python:

import re
texts = ['1д1ч', '1д1м', '1д1ч1м']
for text in texts:
    m = re.search(r'^(?!$)(?:(?P<day>\d+)д)?(?:(?P<hour>\d+)ч)?(?:(?P<minute>\d+)м)?$', text)
    if m:
        print(m.groupdict())

Результат:

{'day': '1', 'hour': '1', 'minute': None}
{'day': '1', 'hour': None, 'minute': '1'}
{'day': '1', 'hour': '1', 'minute': '1'}
→ Ссылка