Python:RegEx用于从“日,日,小时到分钟”获取组

时间:2012-12-19 11:25:27

标签: python regex find

这是我的输入字符串

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个字母周日, 我不明白如何找到RegEx以找到其中的第一组。

我试过了:

(^((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

2 个答案:

答案 0 :(得分:3)

这里不需要正则表达式,只需使用关键字'从'和'分割到' -

对于第一个例子,如果s是你的字符串 -

>>> s.split('from')[0]
'Mon,Tue,Wed '
>>> s.split('from')[1].split('to')
[' 10AM ', ' 12PM']

答案 1 :(得分: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))*)
    
  • from之前和之后必须至少有一个空格。

    \s+from\s+
    
  • 匹配的数字后跟AM / PM(可以是ama.m.,但不是a.mam. - pm相同。也可以选择指定分钟。

    (\d{1,2}(?::\d{1,2})?\s*(?:[ap]m|[ap]\.m\.))
    
  • 我放宽了to部分的条件:部分可以是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+'拆分,然后将第二个令牌拆分为r'\s*(to|[-,])\s*'