用于匹配时间格式的Python正则表达式 - 为什么?

时间:2014-08-29 17:28:22

标签: python regex

我正在编写一个需要匹配小时/分钟/秒的函数,以便允许用户以更方便的方式在命令行上提供时间参数,而不仅仅是指定秒数。

它需要接受的格式包括:

hh:mm:ss
   mm:ss
      ss

我发现了一个在以下位置工作的python正则表达式:http://blog.yjl.im/2012/05/nargs-and-type-check-in-argparse-using.html

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

我的问题是:为什么会有效?我一直认为我对正则表达式相当不错,但即使借助我的作弊表,我也无法完全理解这一点。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

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

正则表达式:

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

说明:

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