我正在编写一个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']
此外,我在regex 中尝试了负面前瞻模式
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.?)
(?![^,])
)"""
但我没有得到预期的结果。我应该明确地写代码来检查条件吗?有没有办法只更改我的正则表达式,而不是编写显式的条件检查?
我喜欢实现的另一种方法是,如果逗号不存在,则在两个工作日持续时间之间插入逗号,并将我的正则表达式更改为group-by-split-by-逗号。"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')]
[]
[]
希望有帮助,
我写了几行代码来检查并在两个工作日之间不存在逗号的情况下在每个逗号后面插入逗号。所以我可以得到相同格式的"Mon - Fri 7am - 5pm, Sat 9am - 3pm"
,我可以继续进行。
不知道如何在一个正则表达式中做到这一点,很难找到一个好问题。我可以做你需要的事,但要知道我并不为此感到骄傲。
假设你有这样的功能。。。
def sample_funct(unparsed_schedule)
result = []
# Day Pattern
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
"""
# No commas pattern
pattern2 = "%ss*[^,]s*%s" % (pattern, pattern)
# Actual Regex Pattern Items
schedule = re.compile(pattern, re.IGNORECASE|re.VERBOSE)
remove_comma = re.compile(pattern2, re.IGNORECASE|re.VERBOSE)
# Check we have no commas in the middle
valid_result = re.search(remove_comma, unparsed_schedule)
if valid_result:
# Positive result, return the list with schedules
result = re.findall(schedule, validresult.group(0))
# If no valid results will return empty list
return result