正则表达式对于解析输入字符串可能是多余的,并且是完全错误的计算总秒数的工具。这是一个简单的替换:
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() 的最新模式的编译版本被缓存,因此一次只使用几个正则表达式的程序不必担心编译正则表达式.
不过,养成这个习惯是个好习惯。只是不在这样的局部函数定义中。