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

时间:2019-02-13 10:12:32

标签: python python-3.x string-parsing

我正在尝试解析格式化的字符串。我需要知道我检索到的每个项目要花多少小时,几分钟和几秒钟。

我收到的数据采用这种格式,例如:

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',它将继续重复相同的数字。

希望这是有道理的,并预先感谢。

5 个答案:

答案 0 :(得分:3)

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

System.setProperty("webdriver.chrome.driver","/path/to/chromedriver");

答案 1 :(得分:2)

这怎么样?

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))

答案 2 :(得分:1)

您可以使用正则表达式和正则表达式中的组来捕获小时,分钟和秒-所有这些都是可选的。

类似的东西:  /PT(\d*)H?(\d*)M?(\d*)S?/

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

但是正则表达式不那么可读。我强烈建议尝试使用Parsec之类的解析器组合器库。解析器组合器更具可读性和可维护性,并且写起来很愉快。

答案 3 :(得分:1)

基于条件的无正则表达式的解决方案

def parse_time(str_to_parse):
    str_to_parse = str_to_parse.split('PT')[1]
    time_units = ['H', 'M', 'S'] #this needs to always be in left to right or bigger to smaller order
    estimated_time = {k: 0 for k in time_units} 
    for k in time_units:
        if k in str_to_parse:
            left, right = str_to_parse.split(k)
            estimated_time[k], str_to_parse = int(left), right
    return estimated_time

estimated = "PT12M3S"
final_time = parse_time(estimated)
print(final_time)
{'H': 0, 'M': 12, 'S': 3}

答案 4 :(得分:1)

我希望这段代码有意义。这是一种非常简单的方法,您可以遍历字符串的字符,将数字添加到当前字符中,并在达到字母字符(“ S”,“ M”,“ H”)后对其进行评估。

estimated = 'PT5H'
clean = estimated.split('PT')[1]
seconds = 0
minutes = 0
hours = 0
current = ''

for char in clean:
    if char.isdigit():
        current += char
    else:
        if char == 'S':
            seconds = int(current)
        elif char == 'M':
            minutes = int(current)
        else:
            hours = int(current)

        current = ''

print(hours, minutes, seconds)