Skip to main content
 首页 » 编程设计

python之从字符串中解析格式奇怪的时间表达式

2025年05月04日2052php

我正在尝试解析格式化字符串。我需要知道我检索到的每个项目已经完成了多少小时、分钟和秒。

我收到的数据是这样的格式,例子:

PT5H12M3S,这意味着 5 小时 12 分 3 秒。

但是,如果工作时间少于一个小时,则不会显示:

PT12M3S,表示 12 分 3 秒。

更重要的是,如果没有在项目上工作(或仅不到一分钟),数据将显示如下:

PT0S

如果一个项目只有完整的工作时间,它将显示为:

PT5H

我尝试使用以下代码解析数据:

estimated = track_data['project']['estimate']['estimate'].split('PT')[1] 
estimated_hours = estimated.split('H')[0] 
estimated_minutes = estimated_hours.split('M')[0] 
estimated_seconds = estimated_minutes.split('S')[0] 

但此解决方案仅适用于数据格式为 PT5H12M3S 的情况。所有其他格式,这是错误的。例如,如果我得到数据 PT5H,那么估计的小时数将为 5,而且估计的分钟数和秒数也将为 5。显然这不是我们想要的。

有没有人可以指导我在哪里看?我用 split 尝试了一些其他的东西,但它似乎不起作用,因为如果它找不到 'M' 或 'S',它只会继续重复相同的数字。

希望这是有道理的,并提前致谢。

请您参考如下方法:

您可以为此使用正则表达式:

import re 
 
PROJECT_TIME_REGEX = re.compile(r'PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?') 
 
def get_project_time(s): 
    m = PROJECT_TIME_REGEX.match(s) 
    if not m: 
        raise ValueError('invalid string') 
    hour, min, sec = (int(g) if g is not None else 0 for g in m.groups()) 
    return hour, min, sec 
 
print(get_project_time('PT5H12M3S')) 
# (5, 12, 3) 
print(get_project_time('PT12M3S')) 
# (0, 12, 3) 
print(get_project_time('PT0S')) 
# (0, 0, 0) 
print(get_project_time('PT5H')) 
# (5, 0, 0)