我正在编写一个Python库,用于解析不同的工作时间字符串并生成标准格式的小时数。我在以下情况卡住了:
我的正则表达式应该将
此外,逗号可以放置在任何地方,但不能放在两个工作日和持续时间之间。例如:
这是我尝试过的内容:
我的正则表达式应该将
Mon - Fri 7am - 5pm Sat 9am - 3pm
分组为['Mon - Fri 7am - 5pm ', 'Sat 9am - 3pm']
,但如果第一段和第二段之间有逗号,则应返回[]
。此外,逗号可以放置在任何地方,但不能放在两个工作日和持续时间之间。例如:
Mon - Fri 7am - 5pm Sat 9am - 3pm and available upon email, phone call
应该返回 ['Mon - Fri 7am - 5pm ', 'Sat 9am - 3pm']
。这是我尝试过的内容:
import re
pattern = """(
(?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|m|w|f|thurs) # Start weekday
\s*[-|to]+\s* # Seperator
(?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|^(?![ap])m|w|f|thurs)? # End 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
)"""
regEx = re.compile(pattern, re.IGNORECASE|re.VERBOSE)
print re.findall(regEx, "Mon - Fri 7am - 5pm Sat 9am - 3pm")
# output ['Mon - Fri 7am - 5pm ', 'Sat 9am - 3pm']
print re.findall(regEx, "Mon - Fri 7am - 5pm Sat - Sun 9am - 3pm")
# output ['Mon - Fri 7am - 5pm ', 'Sat - Sun 9am - 3pm']
print re.findall(regEx, "Mon - Fri 7am - 5pm, Sat 9am - 3pm")
# expected output []
# but I get ['Mon - Fri 7am - 5pm,', 'Sat 9am - 3pm']
print re.findall(regEx, "Mon - Fri 7am - 5pm , Sat 9am - 3pm")
# expected output []
# but I get ['Mon - Fri 7am - 5pm ', 'Sat 9am - 3pm']
我也尝试在我的正则表达式中使用了负向先行断言模式
pattern = """(
(?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|m|w|f|thurs)
\s*[-|to]+\s*
(?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|^(?![ap])m|w|f|thurs)?
\s*[from]*\s*
(?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?)
\s*[-|to]+\s*
(?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?)
(?![^,])
)"""
但是我没有得到预期的结果。我应该显式编写检查条件的代码吗?有没有仅仅修改正则表达式而不需要编写显式条件检查的方法?
另一种我喜欢的实现方式是,在两个工作日持续时间之间插入逗号(如果不存在逗号),然后将我的正则表达式更改为逗号分组/拆分。"Mon - Fri 7am - 5pm Sat 9am - 3pm"
=> "Mon - Fri 7am - 5pm, Sat 9am - 3pm"
re
之前过滤掉逗号。 - CppLearner