【问题标题】:Regular Expression (regex) Search for 'Mmm dd hh:mm:ss' Pattern and Group using Python 3.6正则表达式 (regex) 使用 Python 3.6 搜索“Mmm dd hh:mm:ss”模式和组
【发布时间】:2018-04-11 07:57:06
【问题描述】:

嗨,我正在编写一个 regex 程序来搜索给定句子中的模式 Mmm dd hh:mm:ss。例如,我想确定给定句子中是否存在诸如 Mmm dd hh:mm:ss 之类的模式(例如,Aug 03 50:42:08 是开始工作的乐观时间)。我浏览了属于该主题的many stack overflow questions。但是我仍然无法找出确切的regex pattern (template) 来确定给定句子中是否存在Mmm dd hh:mm:ss

编辑 1:

那么一旦识别出这种模式,应该如何将匹配模式的句子归为一组,将不匹配的句子归为另一组?

目前开发的代码如下:

regexp = re.compile('[a-zA-Z]+(?=\s\d)\s\d+\s\d+:\d+:\d+')
if regexp.search('we shall meet on Jun 26 10:45:09'):
    print('matched')

输出:

>>> matched

【问题讨论】:

  • 你真的需要正则表达式吗?为什么不尝试使用格式字符串进行转换?

标签: python regex datetime


【解决方案1】:

此正则表达式将遵循该模式,但不会验证月份是否正确。

^[A-Z][a-z]{2} \d\d \d\d:\d\d:\d\d$

【讨论】:

    【解决方案2】:

    给定一个字符串,你可以试试这个:

    import re
    s = "We will meet on Jun 10 4:12:40" 
    date = re.findall('[a-zA-Z]+(?=\s\d)\s\d+\s\d+:\d+:\d+', s)[0]
    

    输出:

    'Jun 10 4:12:40'
    

    【讨论】:

      【解决方案3】:

      下面的表达式将不匹配 3 位数的时间,也匹配 1 位数的时间

      1. 与 6 月 10 日 14:100:40 不匹配
      2. 与 100 年 6 月 14:10:40 不匹配
      3. 匹配六月或六月(如果不想接受六月,请将 4 替换为 3

        re.findall(r'\b\w{1,4} \d{1,2} \d{1,2}:\d{1,2}:\d{1,2}',s)

      对匹配和未匹配的模式进行分组

      import re
      s = "We will meet on June 10 14:10:40"
      pattern = r'\b\w{1,4} \d{1,2} \d{1,2}:\d{1,2}:\d{1,2}'
      match = re.search(pattern, s)
      print s[:match.start()]
      print match.group()
      

      【讨论】:

      • @SteffiKeranRaniJ : 检查额外的代码是否能解决您的问题
      【解决方案4】:

      下面的正则表达式也将验证月份:

      (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d \d\d:\d\d:\d\d
      

      【讨论】:

        【解决方案5】:

        我认为this regex 会匹配 24 小时制的格式:

        ^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(0?[1-9]|[12][0-9]|3[01])\s([0-1]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$

        • 从字符串^开始
        • 匹配月份(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
        • 匹配一个空格\s
        • 匹配天数(0?[1-9]|[12][0-9]|3[01])
        • 匹配一个空格\s
        • 匹配 24 小时制的小时数([0-1]?[0-9]|2[0-3])
        • 匹配分号:
        • 匹配分钟[0-5][0-9]
        • 匹配分号:
        • 匹配秒数[0-5][0-9]
        • 匹配行尾$

        注意:这确实注意处理极端情况,例如 Jun 31 23:45:09

        【讨论】:

          【解决方案6】:

          这个问题有点老了,但是因为我找不到任何涵盖所有边缘情况的东西,所以这里是: (请注意,此正则表达式用于匹配,因此删除插入符号和美元符号以进行搜索正则表达式)

          这个正则表达式使得不可能做边缘情况,每次验证都是合法的时间。

          正则表达式:

          ^((Jan|Mar|May|Jul|Aug|Oct|Dec) (?!00|3[2-9])[0-3]\d|(Apr|Jun|Sep|Nov) (0[1-9]|[12]\d|30)|Feb (?!00)[0-2]\d) (?!2[4-9])[0-2]\d:[0-5]\d:[0-5]\d$

          有效例子:
          • 6月3日00:00:00
          • 9 月 30 日 15:19:27
          • 2月28日23:18:41
          • 12 月 31 日 20:03:51
          无效示例:
          • 2 月 30 日 00:00:00(2 月只有 29 天)
          • 12月32日23:26:33(12月只有31天)
          • 9 月 00 日 12:39:51(不能是第 0 天)
          • 4 月 10 日 24:36:11(不能超过 23 小时
          • 5 月 12 日 22:60:43(不能超过 59 秒)
          免责声明:

          作为正则表达式这样做可能很糟糕,尤其是考虑到正则表达式的大小

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-01-25
            • 2020-03-30
            • 1970-01-01
            • 1970-01-01
            • 2012-11-20
            • 2011-12-27
            • 2013-08-16
            相关资源
            最近更新 更多