0

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

4

2 に答える 2

1

キャプチャ グループを繰り返すと、新しい繰り返しごとに前の繰り返しが上書きされます。これは、通常の正規表現では正常な動作です。繰り返しキャプチャ グループの各インスタンス (「キャプチャ」) へのアクセスを許可するのは .NET だけです。

可能な繰り返しの最大数が事前にわかっている場合は、グループを必要なだけ「手動で」繰り返すことができます。

それがわからない場合は、2 つの正規表現を使用します。最初の正規表現を最初から最後の時間範囲に一致させ、2 番目の正規表現 ( を使用して最初の一致に適用finditer()) を 1 つの単一範囲に繰り返し一致させます。

于 2013-02-07T12:40:08.913 に答える
0

正規表現内で繰り返す代わりに、weekday グループをオプションにして、使用を繰り返し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']]
于 2013-02-19T14:29:02.213 に答える