Python 正则匹配时间格式为什么有效?

-2 投票
1 回答
2760 浏览
提问于 2025-04-18 21:02

我正在写一个函数,这个函数需要匹配小时、分钟和秒,这样用户在命令行输入时间时就可以比单纯输入秒数更方便。

它需要接受的格式包括:

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),并且它后面必须跟着行结束的标志。

撰写回答