时间戳的正则表达式

7

我显然很不擅长正则表达式,它对我来说毫无意义...

我想要一个用于在字符串中匹配时间的表达式,例如01:23:45

我尝试了这个:

(r'(([0-9]*2)[:])*2([0-9]*2)

但是它没有起作用。我需要能够获取整个时间戳。其他一些我尝试过的仅找到了其中的两位数字。

5个回答

12

很抱歉,您的中继器设置不正确:

r'\d{2}:\d{2}:\d{2}'

最小和最大数字的正确语法是 {n,m},或者精确匹配使用{n}。字符类\d[0-9]更易于使用;对于正则(非Unicode)匹配来说,它表示相同的含义。


@IgnacioVazquez-Abrams:是的,已经澄清了。 - Martijn Pieters
1
虽然你的答案是正确的,但我认为\d\d:\d\d:\d\d更加直观易懂。 - Engineer
@工程师:这取决于你的经验水平,而且本帖的根本问题是如何匹配重复模式。 - Martijn Pieters
@MartijnPieters 是的,我同意,这取决于经验水平,但当审查您的代码的时间到来时,您需要尽快理解/记住自己的代码。在我看来,我不认为\d{2}:\d{2}:\d{2}\d\d:\d\d:\d\d更明显。 - Engineer
1
@工程师:我不同意,这只是微小的优化。对于更大的n值和更复杂的重复组,您仍然需要理解“{n}”语法,因为您不会将模式写出n次。而且我还没有触及“{n,m}”结构.. - Martijn Pieters
@MartijnPieters 我知道 {n,m} 结构。我并不是指“复杂的重复组”。我只是指当前情况,当您需要验证时间 (00:00:00) 时。 - Engineer

5

为什么要使用正则表达式-使用适当的日期时间函数,可以免费获得验证,并且更易于理解...

from datetime import datetime
time = datetime.strptime('01:23:45', '%H:%M:%S').time()
print time.hour, time.minute, time.second
# 1 23 45

低效时间:

>>> datetime.strptime('99:45:63', '%H:%M:%S')
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    datetime.strptime('99:45:63', '%H:%M:%S')
  File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '99:45:63' does not match format '%H:%M:%S'

3
可能OP有一个包含时间戳的较大字符串。在传递给strptime之前,需要先提取出来,就像排序一样。 - Martijn Pieters
是的,这就是我正在做的事情。不过这仍然很酷,谢谢! - user1159454
@user1159454 公平竞争:一个好的组合是使用提供的正则表达式进行提取,然后可能进行验证 - 我想整个时间戳不能方便地从字符串中选择? - Jon Clements
不需要,这个正则表达式对这个任务已经足够了,但是谢谢!我会记住这个方法用于更大的任务。 - user1159454

2
正确的指定符号以重复前一个匹配两次是 {2}
[0-9]{2}

2

你应该使用{2}而不是*2

[0-9]{2}:[0-9]{2}:[0-9]{2}

0
import re

timestamp_regex = r'(2[0-3]|[01][0-9]|[0-9]):([0-5][0-9]|[0-9]):([0-5][0-9]|[0-9])'


print(bool(re.match(timestamp_regex, '01:23:45')))  # True
print(bool(re.match(timestamp_regex, '01:01:45')))  # True
print(bool(re.match(timestamp_regex, '01:01:01')))  # True
print(bool(re.match(timestamp_regex, '1:1:1')))     # True
print(bool(re.match(timestamp_regex, '25:1:1')))    # False

演示:https://ideone.com/eE0Pnb


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接