正则表达式的时间范围开始太远

时间:2016-10-28 09:54:38

标签: python regex

我正在尝试找到表单的时间范围

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

使用简单的正则表达式((\d+):(\d+)-?)+ (.*)。它适用于第一个示例,但对于第二个示例,匹配仅从12:50开始,并且不会捕获第一个时间范围。

你明白为什么吗?

这是Python中的Regex101 example和最小示例:

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

1 个答案:

答案 0 :(得分: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']
>>>