我正在尝试找到表单的时间范围
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())
答案 0 :(得分:1)
您无法使用Python re
访问重复捕获,您需要显式解包量化组并使第二部分可选:
(\d+):(\d+)(?:-(\d+):(\d+))? (.*)
^^^^^^^^^^^^^^^^^
请参阅regex 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']
>>>