Python3重新分组几个组,即使其中一些缺少

时间:2019-03-08 13:19:57

标签: python regex

我有一个格式如下的持续时间列表:

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

我尝试过这样的分组:

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

其中x是列表中的任何元素,因为我希望使用它的time()格式:

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]))

但是当没有匹配项时,代码就会中断。

是否存在一种解决方案,可以用零(例如)填充不匹配的搜索,或者更容易进行另一次尝试?

我已经找到了这种方法,但是我无法将其应用于我的案例: How to ignore unmatched group in a string in re python?

2 个答案:

答案 0 :(得分:3)

使用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))

答案 1 :(得分:0)

此解决方案提供了包含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)? <-这将匹配1个或多个数字,后跟一个文字H,但是整个术语都是可选的,因为它后面是一个?