2014-08-29 78 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