1

对于一个类,我必须编写一个函数,它采用 03:12:19 形式的时间(换句话说,三小时十二分十九秒)并将它们转换为相应的秒数。我已经开始但似乎无法让数学工作,这是我目前拥有的代码:

def secs(timestr):
    import re
    timexp = re.compile('(\d\d):(\d\d):(\d\d)')
    calc = re.sub(timexp,r'int(\1)*3600+int(\2*60)+int(\3)',timestr)
    return print(calc)

str = '03:20:13'
secs(str)

我已经搞砸了删除 r 但它给了我一个奇怪的结果。帮助?

4

3 回答 3

7

正则表达式对于解析输入字符串可能是多余的,并且是完全错误的计算总秒数的工具。这是一个简单的替换:

def secs(timestr):
    hours, minutes, seconds = timestr.split(':')
    return int(hours) * 3600 + int(minutes) * 60 + int(seconds)

这不处理错误检查(不是正确数量的 ':' 分隔符、非数字内容等),但您原来的正则表达式方法也不处理。如果您确实需要检查输入,我会这样做:

def secs(timestr):
    timeparts = timestr.split(':')
    if len(timeparts) == 3 and all((part.isdigit() for part in timeparts)):
        return int(timeparts[0]) * 3600 + int(timeparts[1] * 60 + int(timeparts[2])
    else:
        # not a matching string - do whatever you like.
        return None

还有其他方法。

如果您想要一个字符串而不是整数来表示秒数,return str(int(hours) * 3600 + int(minutes) * 60 + int(seconds)).

编辑:响应“我被指示使用正则表达式替换来执行此操作,这就是我必须做的”:

re.sub可以采用两种不同的替换参数。您可以提供字符串模式或函数来计算替换字符串。字符串模式不做数学运算,因此您必须使用函数。

如果 repl 是一个函数,则每次出现不重叠的模式时都会调用它。该函数采用单个匹配对象参数,并返回替换字符串。

def _calculate_seconds(timematch):
    return str(int(timematch.group(1)) * 3600 + int(timematch.group(2)) * 60 + int(timematch.group(3)))

def secs(timestr):
    timexp = re.compile(r'(\d{1,2}):(\d{1,2}):(\d{1,2})')
    return re.sub(timexp, _calculate_seconds, timestr)

但这是一种不好的方法,除非您尝试将这些时间模式的多次出现转换为一个较大的字符串。

在这里编译正则表达式并不是真正必要的,甚至没有帮助,因为每次调用函数时都要重做它。通常的方法是在函数之外编译它 - 但正如正则表达式文档所指出的:

传递给 re.match()、re.search() 或 re.compile() 的最新模式的编译版本被缓存,因此一次只使用几个正则表达式的程序不必担心编译正则表达式.

不过,养成这个习惯是个好习惯。只是不在这样的局部函数定义中。

于 2013-08-11T21:06:41.807 回答
1

您正在使用 re.sub,它将正则表达式匹配替换为第二个参数。

相反,您应该运行 re.match(timexp, timestr) 来获取匹配对象。该对象有一个用于访问组的 API(正则表达式的括号部分):match.group(0) 是整个字符串,match.group(1) 是第一个两位数块,match.group(2) 是第二, ...

您可以从那里处理内存中的数字。

于 2013-08-11T21:06:55.037 回答
0

另一种选择是尝试切片。(这里有一些关于切片符号的信息:解释 Python 的切片符号

如果传递给函数的时间始终采用相同的格式(即 hh:mm:ss),那么切片将允许您分离时间的每个组成部分。对字符串进行切片仍会返回一个字符串,因此对每个切片的时间分量使用 int()。secs 函数看起来像这样:

def secs(timestr):
    hours = int(timestr[:2])
    minutes = int(timestr[3:5])
    seconds = int(timestr[6:])
    totalsecs = hours * 3600 + minutes * 60 + seconds
    return totalsecs
于 2013-08-11T21:38:49.140 回答