2016-10-28 53 views
0

我想找到的形式正則表達式定義時間段開始太遠

12:30 Test 
12:30-12:50 Test 

與簡單的regex ((\d+):(\d+)-?)+ (.*)的時間範圍。對於第一個示例,它工作正常,但對於第二個示例,匹配僅從12:50開始,並且不會捕獲第一個時間範圍。

你明白爲什麼了嗎?

這裏是一個Regex101 example和Python中的小例子:

import re 
    print(re.search("^((\d+)(?::|h)(\d+)-?)+ (\w.*)", "12:30-12:50 Test").groups()) 

回答

1

您可以使用Python re訪問重複捕獲,你不需要明確解開量化組,使第二部分可選:

(\d+):(\d+)(?:-(\d+):(\d+))? (.*) 
      ^^^^^^^^^^^^^^^^^ 

regex demo

Python demo

import re 
rx = r"(\d+):(\d+)(?:-(\d+):(\d+))? (.*)" 
strs = ["12:30 Test", "12:30-12:50 Test"] 
for str in strs: 
    m = re.search(rx, str) 
    if m: 
     print(m.groups()) 

輸出:

('12', '30', None, None, 'Test') 
('12', '30', '12', '50', 'Test') 

隨着PyPi regex,您可以訪問所有的captures,看到你的正則表達式的例子:

>>> import regex 
>>> strs = ["12:30 Test", "12:30-12:50 Test"] 
>>> for str in strs: 
    m = regex.search(r'((\d+):(\d+)-?)+ (.*)', str) 
    if m: 
     print(m.captures(1)) 
     print(m.captures(2)) 
     print(m.captures(3)) 


['12:30'] 
['12'] 
['30'] 
['12:30-', '12:50'] 
['12', '12'] 
['30', '50'] 
>>>