如何將條件指定給 "try" 和 "except" 函數?

2024-10-01 15:28:31 发布

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

我有一个清单,可以如下所示

timeLength = ["1h", " 2h 1min", " 1h 37min", "1h 33min",''''']

我要做的是将所有这些转换成整数分钟。 我已经设法做了一个尝试和例外的情况下,“2小时1分钟”的工作,如果h没有出现给你一个错误,那么只使用分钟这样。你知道吗

            try:
                hour, minute = timeLength.split("h")
                hour = (int(hour)* 60)
                minString = minute.strip("min")
                minString = re.findall(r'\d+', minString)
                minString = list(map(int, minString))
                minString = minString[0]
                totalLength = minString + hour
            except:
                hour = 0
                minString = timeLength.strip("min")
                minString = re.findall(r'\d+', minString)
                minString = list(map(int, minString))
                minString = minString[0]
                totalLength = hour + minString
print(totalLength)

考虑到只有“h”的实例,我需要添加什么。你知道吗

注意:可能有更多的例子,我还没有找到,所以我需要一种方法,以方便添加他们时,他们出现。你知道吗

提前谢谢。你知道吗


Tags: remap情况整数minlistintstrip
2条回答

只要我们使用regex,不妨充分利用它:

def to_minutes(text):
    match = re.match('\s*(\d+)h(?:\s*(\d+)m)?', timelength)
    if match is None:
         # it wasn't a valid string, so handle the error as you like
    else:
         h, m = match.groups()
         # the `m` may be None, but otherwise both values are valid for `int`.
         if m is None:
             m = 0
         return int(h) * 60 + int(m)

分解正则表达式:

\s*(\d+)h(?:\s*(\d+)m)?
^^^
zero or more whitespace chars
   ^^^^^^
   digits followed by 'h' (captured)
         ^^^         ^^
         optionally this stuff, but don't make a capturing group
            ^^^
            whitespace again
               ^^^^^^
               digits followed by 'm' (captured)

那么,每一场成功的比赛都有一组时间和分钟数。当分钟计数组(由它所包装的(?:...)?设置为可选)不匹配时,该组将捕获None,而不是子字符串。non-capturing组允许我们指定最后的?是可选的,但是不需要另一个组来捕获m和前导空格。你知道吗

我个人会用一个正则表达式来解决这个问题,而不是试图单独列举所有可能的格式:

import re

def to_minutes(s):
   h, m = re.match(r'(?:(\d+)h)?\s*(?:(\d+)min)?', s.strip()).groups()
   return int(h or 0) * 60 + int(m or 0)

timeLength = ["1h", " 2h 1min", " 1h 37min", "1h 33min"]
for s in timeLength:
  print(s, to_minutes(s))

此处:

  • (?:(\d+)h)?可选地匹配后跟h的数字
  • \s*匹配零个或多个空格
  • (?:(\d+)min)?可选地匹配后跟min的数字。你知道吗

(\d+)捕获数字,而周围的(?:)?只是一种使某些内容可选的方法,而不必创建捕获组。你知道吗

最后,h or 0m or 0简单地用零替换None(如果输入中不存在小时或分钟,就会出现这种情况),以简化计算。你知道吗

很容易将此方案扩展到更多的时间单位(天、周等)。你知道吗

注意,如果我在生产代码中这样做,我会将regex格式化为^{} with inline comments。你知道吗

相关问题 更多 >

    热门问题