我正在尝试解析格式化的字符串。我需要知道我检索到的每个项目要花多少小时,几分钟和几秒钟。
我收到的数据采用这种格式,例如:
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',它将继续重复相同的数字。
希望这是有道理的,并预先感谢。
答案 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)