从字符串解析格式怪异的时间表达式

2024-09-28 05:27:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在分析格式化的字符串。我需要知道有多少小时,分和秒,我检索的每个项目已经工作。你知道吗

我收到的数据格式如下,例如:

PT5H12M3S,意思是5小时12分3秒。你知道吗

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

PT12M3S,这意味着12分3秒。你知道吗

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

PT0

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

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',它只会不断重复相同的数字。你知道吗

希望这是有意义的,并提前感谢。你知道吗


Tags: 数据项目字符串格式时间split数据格式小时
3条回答

可以使用正则表达式:

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)

怎么样?你知道吗

import re

def parsept(ptstring):
    regex = re.compile(
            r'PT'
            r'(?:(?P<h>\d+)H)?'
            r'(?:(?P<m>\d+)M)?'
            r'(?:(?P<s>\d+)S)?')
    m = regex.match(ptstring)
    if m:
        return (int(m.group('h')) if m.group('h') else 0, 
            int(m.group('m') if m.group('m') else 0,
            int(m.group('s') if m.group('s') else 0)
    # else
    raise ValueError('{0} does not look like a valid PTxHyMzS string'.format(ptstring))

您可以使用正则表达式和正则表达式中的组来捕获小时、分钟和秒—所有这些都是可选的。你知道吗

大致如下: /PT(\d*)H?(\d*)M?(\d*)S?/

括号表示组。因此,您的捕获组将包含小时、分钟和秒(所有这些都是可选的)。你知道吗

但是正则表达式不是那么可读。我强烈建议尝试像Parsec这样的解析器组合库。解析器组合器更具可读性和可维护性,编写起来也很有趣。你知道吗

相关问题 更多 >

    热门问题