2014-08-29 68 views
-2

我正在写一个函数,需要匹配小时/分钟/秒,以便允许用户以更方便的方式提供时间参数,而不仅仅是指定秒数。Python正则表达式匹配时间格式 - 为什么?

它需要接受的格式包括:

hh:mm:ss 
    mm:ss 
     ss 

我发现一条巨蟒正则表达式,在以下位置的工作原理:http://blog.yjl.im/2012/05/nargs-and-type-check-in-argparse-using.html

的正则表达式是:'^(?:(?:(\d+):)?(\d+):)?(\d+)$'

我的问题是:为什么它的工作?我一直认为我用正则表达式很好,但即使在我的作弊表的帮助下,我也无法完全理解这一点。

有人可以解释一下吗?

+0

这不适用于'dd:hh:mm:ss'。 – simonzack 2014-08-29 17:31:06

+2

http://rick.measham.id.au/paste/explain.pl?regex=%5E%28%3F%3A%28%3F%3A%28%5Cd%2B%29%3A%29%3F% 28%5Cd%2B%29%3A%29%3F%28%5Cd%2B%29%24 – hjpotter92 2014-08-29 17:32:30

+0

你绝对正确 - 因为它不适用于'dd:hh:mm:ss'。但正如我所指出的那样,我将能够扩展它来做到这一点。但我会编辑原始帖子以避免混淆。 – 2014-08-29 17:34:40

回答

1

不要与此混淆non-captring group(?:...)。它不会捕获与此非捕获组内的模式匹配的字符。 ()称为capturing group

正则表达式:

^(?:(?:(\d+):)?(\d+):)?(\d+)$ 

说明:

  • (?:(\d+):)?前两个数字+ :匹配(即,hh:),仅捕获数字,并将其存储到一个组。 ?使它成为可选的存在。所以它可能会发生也可能不会发生。
  • (?:(?:(\d+):)?(\d+):)?而第二个(\d+):匹配mm:,它只捕获数字,并且必须存在。所以它匹配mm:如果hh:存在与否。在非捕获组使整个存在成为可选之后,可以使用?。所以hh:mm:可能会或可能不会发生。
  • (\d+)$捕获一个或多个数字(即,ss),并且它后面必须跟着一个行尾锚点。
+1

我的建议是使用'\ d {2}'而不是'\ d +' – 2014-08-29 17:44:36

+0

感谢您的回复。这使我对发生了什么事情有了基本的了解。我认为这是非捕获组织的存在,使我陷入了一个循环。 – 2014-08-29 17:52:11

+1

看到这个[demo](http://regex101.com/r/mB3dI7/1)链接和组在右侧。组1 = hh,组2 = mm,组3 = ss – 2014-08-29 17:54:45