-1

これは私の入力文字列です

1. Mon,Tue,Wed from 10AM to 12PM
2. Mon from 10AM to 12PM
3. Mon, Tue, Wed, Thu from 10AM to 12PM

私のグループになりたい

1. ["Mon,Tue,Wed", "10AM","12pm"]
2. ["Mon", "10AM", "12PM"]
3. ["Mon, Tue, Wed, Thu", "10AM", "12PM"]

ここで、最初のグループにはコンマで区切られた3文字の平日が付属していますが、最初のグループを見つけるための正規表現を見つける方法がはっきりとわかりません。

私は試した:

(^((mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|m|w|f),?){1,} # Weekday
\s*[from]*\s* # Seperator
(\d{1,2}(?:[:]\d{1,2})?)\s*([ap][.]?m.?) # Start hour
\s*[-,(to)]+\s* # Seperator
(\d{1,2}(?:[:]\d{1,2})?)\s*([ap][.]?m.?)) # Close hour
4

2 に答える 2

3

ここでは正規表現は必要ありません。キーワード「from」と「to」を使用して分割するだけです-

最初の例では、sが文字列の場合-

>>> s.split('from')[0]
'Mon,Tue,Wed '
>>> s.split('from')[1].split('to')
[' 10AM ', ' 12PM']
于 2012-12-19T11:29:25.963 に答える
3

と一緒に使用することを意味しますre.findall。1番目、2番目、3番目のキャプチャグループでキャプチャされた結果。後の追加は、コメントに入力した正規表現に基づいています。

r'(?i)((?:sun|mon|tue|wed|thu|fri|sat)(?:\s*,\s*(?:sun|mon|tue|wed|thu|fri|sat))*)\s+from\s+(\d{1,2}(?::\d{1,2})?(?:[ap]m|[ap]\.m\.))(?:\s+to\s+|\s*[-,]\s*)(\d{1,2}(?::\d{1,2})?(?:[ap]m|[ap]\.m\.))'

正規表現の内訳:

  • 大文字小文字を区別しません

    (?i)
    
  • 曜日のリスト。柔軟な間隔を考慮してください。末尾または追加の,許可はありません:

    ((?:sun|mon|tue|wed|thu|fri|sat)(?:\s*,\s*(?:sun|mon|tue|wed|thu|fri|sat))*)
    
  • の前後に少なくとも1つのスペースが必要fromです。

    \s+from\s+
    
  • 一致する番号の後にAM/PMが続きます(amまたはa.m.、ではなく、a.mまたはam.-同じpm)。また、オプションで分を指定できるようにします。

    (\d{1,2}(?::\d{1,2})?\s*(?:[ap]m|[ap]\.m\.))
    
  • パーツの条件を緩和しました。totoパーツはto、、-または,です。to前後にスペースが必要ですが、前後にスペースは必要-あり,ません。

    (?:\s+to\s+|\s*[-,]\s*)
    
  • 同上

    (\d{1,2}(?::\d{1,2})?\s*(?:[ap]m|[ap]\.m\.))
    

このアプローチでは、入力をトークンに分割しながら、トークンも検証します。

検証が不要な場合は、theharshest提案されているように分割を使用できます。最初に使用re.splitして分割しr'\s+from\s+'、次に2番目のトークンをで分割しますr'\s*(to|[-,])\s*'

于 2012-12-19T11:29:39.177 に答える