-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 个字母工作日,我不清楚如何找到 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
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))*)
    
  • 前后必须至少有一个空格from

    \s+from\s+
    
  • 匹配数字后跟 AM/PM(可以是amor a.m.,但不是a.mor am.- 与 相同pm)。还允许可选地指定分钟。

    (\d{1,2}(?::\d{1,2})?\s*(?:[ap]m|[ap]\.m\.))
    
  • 我放宽了topart 的条件: to 部分可以是to, or-,. 之前和之后必须有空格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*'.

于 2012-12-19T11:29:39.177 回答