Python:RegEx重复子组查找

时间:2013-02-07 12:27:46

标签: python regex string regex-lookarounds regex-group

我有一个字符串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本身来完成,但我在表达中遗漏了一些内容。

2 个答案:

答案 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']]