python регулярное выражение, извлечение чисел из дней, часов, минут - PullRequest
4 голосов
/ 22 апреля 2020

Я изучал python регулярные выражения и задавался вопросом, как извлечь числа из x days y hours z minutes?

Примечание: здесь нет месяцев или секунд, допускается только один или несколько дней, минут и секунд.

Моя попытка

import re

s1 = '5 days 19 hours 30 minutes'
s2 = '5 days'
s3 = '19 hours'
s4 = '5 days 19 hours'

pat = r'((\d+)(?<=\sdays))?((\d+)(?<=\shours))?((\d+)(?<=\sminutes))?'


d,h,m = re.findall(pat,s)

Note: 2 days 3 hours ==> d=2 h=3
      2 hours 3 minutes ==> h=2 m=3

Я пытаюсь исправить взгляды. Как решить проблему?

1 Ответ

5 голосов
/ 22 апреля 2020

почему вы добавляете ?<=? Слушай, я добавляю группы к твоему регулярному выражению и добавляю пропущенные пробелы

Затем ты можешь сопоставить свое регулярное выражение и выбирать группы.

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, которая поможет вам понять, что делает каждый элемент.

...