为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哆啦的时光机 2021-11-30 15:59:42
我有一个格式如下的持续时间列表:['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))


查看完整回答
反对 回复 2021-11-30
?
慕桂英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,但整个术语是可选的,因为它后跟一个?。


查看完整回答
反对 回复 2021-11-30
  • 2 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信