почему вы добавляете ?<=
? Слушай, я добавляю группы к твоему регулярному выражению и добавляю пропущенные пробелы
Затем ты можешь сопоставить свое регулярное выражение и выбирать группы.
Python 3.7
import re
s4 = '5 days 19 hours'
pat = r'(?P<days>(\d+)(\sdays))? ?(?P<hours>(\d+)(\shours))? ?(?P<minutes>(\d+)(\sminutes))?'
match = re.match(pat, s4)
if match:
print(match.groupdict()) # print all groups
# Output: {'days': '5 days', 'hours': '19 hours', 'minutes': None}
Если вы хотите сопоставить только количество значений, а не имя и номер, вам нужно использовать следующий шаблон:
r'((?P<days>\d+) days)? ?((?P<hours>\d+) hours)? ?((?P<minutes>\d+) minutes)?'
"""
Here I deconstruct the pattern,
then you can look at it and the next time you can make your own without help.
((?P<days>\d+) days)? Match numbers + space + "days"
? Match space
((?P<hours>\d+) hours)? Match numbers + space + "hours"
? Match space
((?P<minutes>\d+) minutes)? Match numbers + space + "minutes"
If you want the group "days" return you the number and the word "days" yo need to use it as:
(?P<days>\d+ days)
"""
https://regex101.com/ это хорошее место, чтобы попробовать свои модели. Он имеет хорошую IDE, которая поможет вам понять, что делает каждый элемент.