<p>regexp对于解析输入字符串来说可能是太过了,而对于计算总秒数,regexp是完全错误的工具。这里有一个简单的替代品:</p>
<pre><code>def secs(timestr):
hours, minutes, seconds = timestr.split(':')
return int(hours) * 3600 + int(minutes) * 60 + int(seconds)
</code></pre>
<p>这不处理错误检查(不是正确数量的“:”分隔符、非数字内容等),但是原始的regexp方法也不处理。如果您确实需要检查输入,我会这样做:</p>
^{pr2}$
<p>还有其他方法。在</p>
<p>如果您想要一个字符串而不是整数表示秒数,<code>return str(int(hours) * 3600 + int(minutes) * 60 + int(seconds))</code>。在</p>
<p>编辑:针对“我被指示使用regexp替换来完成此操作,因此我必须这样做”:</p>
<p><a href="http://docs.python.org/2/library/re.html#re.sub" rel="nofollow">re.sub</a>可以接受两种不同类型的替换参数。可以提供字符串模式或函数来计算替换字符串。字符串模式不做数学运算,所以必须使用函数。在</p>
<blockquote>
<p>If repl is a function, it is called for every non-overlapping occurrence of pattern. The function takes a single match object argument, and returns the replacement string.</p>
</blockquote>
<pre><code>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)
</code></pre>
<p>但这是一种糟糕的方法,除非您试图在单个较大的字符串中转换这些时间模式的多次出现。在</p>
<p>在这里,编译regexp不是真正必要的,甚至没有帮助,因为每次调用函数时都要重新编译。通常的方法是在函数外部编译它,但正如<a href="http://docs.python.org/2/library/re.html#re.compile" rel="nofollow">regexp docs</a>注意:</p>
<blockquote>
<p>The compiled versions of the most recent patterns passed to re.match(), re.search() or re.compile() are cached, so programs that use only a few regular expressions at a time needn’t worry about compiling regular expressions.</p>
</blockquote>
<p>不过,这是个好习惯。只是不在像这样的局部函数定义中。在</p>