我有一个格式如下的持续时间列表:['PT1H38M55S', 'PT25M28S', 'PT2H26S', ...]我试过这样的分组:import rere.search('PT([0-9]+|)H?([0-9]+|)M?([0-9]+|)S?', x).group(1, 2, 3)其中 x 是列表中的任何元素,因为我想要一个 time() 格式:from datetime import timedef 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]))但是当没有匹配时,代码就会中断。是否有解决方案用零填充不匹配的搜索(例如)或其他尝试会更容易?
2 回答
胡说叔叔
TA贡献1804条经验 获得超8个赞
使用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
TA贡献1848条经验 获得超10个赞
此解决方案提供包含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,但整个术语是可选的,因为它后跟一个?。
添加回答
举报
0/150
提交
取消