我正在编写一个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"
最佳答案
我认为您可以简单地通过匹配整个表达式来做到这一点,这样逗号(和其他字符是不允许的:
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
)
)+$""
这将输出:
[('Sat 9am - 3pm', 'Sat 9am - 3pm')]
[('Sat - Sun 9am - 3pm', 'Sat - Sun 9am - 3pm')]
[]
[]
希望能帮助到你,
关于javascript - RegEx模式解析工作时间字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14746644/