我正在编写一个需要匹配小时/分钟/秒的函数,以便允许用户以更方便的方式在命令行上提供时间参数,而不仅仅是指定秒数。
它需要接受的格式包括:
hh:mm:ss
mm:ss
ss
我发现了一个在以下位置工作的python正则表达式:http://blog.yjl.im/2012/05/nargs-and-type-check-in-argparse-using.html
正则表达式是:'^(?:(?:(\d+):)?(\d+):)?(\d+)$'
。
我的问题是:为什么会有效?我一直认为我对正则表达式相当不错,但即使借助我的作弊表,我也无法完全理解这一点。
有人可以解释一下吗?
答案 0 :(得分:1)
请勿与此non-captring group (?:...)
混淆。它不会捕获与此非捕获组内存在的模式匹配的字符。 ()
名为capturing group。
正则表达式:
^(?:(?:(\d+):)?(\d+):)?(\d+)$
说明:
(?:(\d+):)?
匹配前两位+ :
(即hh:
),仅捕获数字并将其存储到一个组中。 ?
使其显示为可选。所以它可能会也可能不会发生。(?:(?:(\d+):)?(\d+):)?
第二个(\d+):
匹配mm:
,它只捕获数字,并且必须存在。因此,如果mm:
存在与hh:
匹配,则匹配?
。hh:mm:
在非捕获组将整个存在视为可选后。因此(\d+)$
可能会或可能不会发生。ss
捕获一个或多个数字(即{{1}}),后面必须跟一个行尾锚点。