我有一个字符串Tue 6:30 AM - 12:00 PM, 3:00 PM- 7:00 PM
,我希望得到
["Tue", ["6:30 AM - 12:00 PM", "3:00 PM- 7:00 PM"]]
我试过了,
(
((?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|m|w|f|thurs)) #weekday
\s
( ( (?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?) \s*[-|to]+\s* (?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?) # hour:min period
) ,?\s?
)+
)
但这只是第一次持续时间,["Tue", ["3:00 PM- 7:00 PM", "3:00 PM- 7:00 PM"]]
我可以尝试在程序中用逗号分隔持续时间,但我不希望这样做,因为有一种方法可以通过RegEx
本身来完成,但我在表达中遗漏了一些内容。
答案 0 :(得分:1)
当您重复捕获组时,每个新重复都将覆盖前一个重复。这是正则表达式中的正常行为。只有.NET允许访问重复捕获组的每个实例(“捕获”)。
如果您事先知道可能的最大重复次数是多少,那么您可以根据需要“手动”重复该组。
如果您不知道,请使用两个正则表达式:让第一个匹配从第一个到最后一个时间范围,让第二个匹配(使用finditer()
应用于第一个匹配)匹配一个范围反复。
答案 1 :(得分:0)
不是在正则表达式中重复,而是可以使工作日组成为可选项,使用findall
重复并在循环中构造结果:
import re
regex = re.compile(r'''
(?:(mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|m|w|f|thurs)\s*)? #weekday
( (?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?) \s*[-|to]+\s* (?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m[.]?) # hour:min period
)''',
re.VERBOSE | re.IGNORECASE)
matches = regex.findall("Tue 6:30 AM - 12:00 PM, 3:00 PM- 7:00 PM")
#[('Tue', '6:30 AM - 12:00 PM'), ('', '3:00 PM- 7:00 PM')]
res = []
for day, dur in matches:
if day:
res += [day, [dur]]
else:
res[-1].append(dur)
print res
#['Tue', ['6:30 AM - 12:00 PM', '3:00 PM- 7:00 PM']]