разделить строку по параметрам
Есть строка вида "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'}