Python3 re.group 几个组,即使有些丢失

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


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

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


是否有解决方案用零填充不匹配的搜索(例如)或其他尝试会更容易?



哆啦的时光机
浏览 140回答 2
2回答

胡说叔叔

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

慕桂英546537

此解决方案提供包含None缺失元素的元组:l = ['PT1H38M55S', 'PT25M28S', 'PT2H26S']for i in l:&nbsp; &nbsp; result = re.search('PT([0-9]+H)?([0-9]+M)?([0-9]+S)?', i)&nbsp; &nbsp; if result:&nbsp; &nbsp; &nbsp; &nbsp; print(result.groups())输出:('1H', '38M', '55S')(None, '25M', '28S')('2H', None, '26S')正则表达式如下: ([0-9]+H)?<-- 这将匹配 1 个或多个数字后跟一个文字H,但整个术语是可选的,因为它后跟一个?。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python