【问题标题】:RegEx pattern to parse working hours string解析工作时间字符串的正则表达式模式
【发布时间】:2013-02-07 08:25:22
【问题描述】:

我正在编写一个 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之前过滤掉逗号。
  • 我需要逗号进行进一步处理,所以如果"Mon - Fri 7am - 5pm Sat 9am - 3pm",我想在两周持续时间之间添加逗号。我现在将编辑我的问题。 “进一步处理”- 如果逗号存在,我已经有一个解析器来标准化字符串。

标签: javascript python regex datetime python-2.7


【解决方案1】:

我认为你可以简单地通过匹配整个表达式来做到这一点,以便逗号(和其他字符是不允许的:

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')]
[]
[]

希望对你有帮助,

【讨论】:

  • 你注意到数组中的两个项目了吗?
  • 是的,我正在努力寻找更好的解决方案 :) (实际上我无法弄清楚为什么当你删除第一个括号时它不起作用......)
【解决方案2】:

如果逗号在两个工作日期间不存在,我编写了几行代码来检查和插入逗号。所以我可以得到相同的格式"Mon - Fri 7am - 5pm, Sat 9am - 3pm",我可以继续前进。

【讨论】:

    【解决方案3】:

    想不出如何在单个正则表达式中做到这一点,很难找到一个好问题。 我可以做你需要的,但请注意,我并不以此为荣。

    假设你有一个函数可以做到这一点......

    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 = "%s\s*[^,]\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 
    

    【讨论】:

    • 谢谢!我将字符串设置为唯一格式,即插入没有逗号的逗号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2017-12-23
    • 2016-04-29
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多