Python3 перегруппировать несколько групп, даже если некоторые из них отсутствуют - PullRequest
2 голосов
/ 08 марта 2019

У меня есть список значений продолжительности, отформатированный следующим образом:

['PT1H38M55S', 'PT25M28S', 'PT2H26S', ...]

Я пробовал такую ​​группировку:

import re
re.search('PT([0-9]+|)H?([0-9]+|)M?([0-9]+|)S?', x).group(1, 2, 3)

, где x - любой элемент из списка, потому что я хочуФормат времени () из него:

from datetime import time
def parse_duration(x):
    HMS = re.search('PT([0-9]+)H([0-9]+)M([0-9]+)S', x).group(1, 2, 3)
    return time(int(HMS[0]), int(HMS[1]), int(HMS[2]))

Но если совпадения нет, код ломается.

Есть ли решение заполнить несогласованный поиск нулем (например) или другой попыткойбыло бы проще?

Я нашел такой метод, но я не смог применить его к своему случаю: Как игнорировать несопоставленную группу в строке в re python?

Ответы [ 2 ]

3 голосов
/ 08 марта 2019

Использование Match.groups:

def parse_duration(x):
    HMS = re.search('PT(?:([0-9]+)H)?(?:([0-9]+)M)?(?:([0-9]+)S)?', x).groups(0)
    return time(*map(int, HMS))
0 голосов
/ 08 марта 2019

Это решение предоставляет кортежи, которые включают None для отсутствующих элементов:

l = ['PT1H38M55S', 'PT25M28S', 'PT2H26S']
for i in l:
    result = re.search('PT([0-9]+H)?([0-9]+M)?([0-9]+S)?', i)
    if result:
        print(result.groups())

Вывод:

('1H', '38M', '55S')
(None, '25M', '28S')
('2H', None, '26S')

Регулярное выражение выглядит следующим образом: ([0-9]+H)? <- Thisбудет соответствовать 1 или более цифрам, за которыми следует литерал <code>H, но весь термин является необязательным, поскольку за ним следует ?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...