Python 正则匹配时间格式为什么有效?
我正在写一个函数,这个函数需要匹配小时、分钟和秒,这样用户在命令行输入时间时就可以比单纯输入秒数更方便。
它需要接受的格式包括:
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 个回答
1
不要把这个 非捕获组 (?:...)
和捕获组搞混了。非捕获组里面的内容不会被记录下来,而 ()
叫做 捕获组,它会把匹配到的内容保存起来。
正则表达式:
^(?:(?:(\d+):)?(\d+):)?(\d+)$
解释:
(?:(\d+):)?
这个部分匹配前面两个数字加上一个:
(比如hh:
),它只会捕获数字并存储到一个组里。?
表示这个部分是可选的,所以它可以出现也可以不出现。(?:(?:(\d+):)?(\d+):)?
这里的第二个(\d+):
匹配mm:
,它同样只捕获数字,并且这个部分是必须出现的。所以无论hh:
是否存在,它都会匹配mm:
。前面的?
让整个非捕获组变成可选的,所以hh:mm:
可以出现也可以不出现。(\d+)$
这个部分捕获一个或多个数字(比如ss
),并且它后面必须跟着行结束的标志。