我有一个格式如下的持续时间列表:
['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?
答案 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
,但是整个术语都是可选的,因为它后面是一个?
。