这是我的输入字符串
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
答案 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(可以是am
或a.m.
,但不是a.m
或am.
- 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*'
。