2016-10-28 50 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'] 
>>>