【问题标题】:Python regex match OR operatorPython 正则表达式匹配 OR 运算符
【发布时间】:2013-11-18 05:53:12
【问题描述】:

我正在尝试匹配上午或下午的时间格式。

i.e. 02:40PM
     12:29AM 

我正在使用以下正则表达式

timePattern = re.compile('\d{2}:\d{2}(AM|PM)')

但它只返回 AM PM 没有数字的字符串。怎么了?

【问题讨论】:

  • 也许使用捕获组
  • @Tommy:他正在使用捕获组;这就是造成问题的原因。当正则表达式具有捕获组时,findall() 仅返回那些,而不是完整匹配。
  • 请注意,您也可以完全避开该组,将(AM|PM) 更改为[AP]M

标签: python regex string time


【解决方案1】:

使用非捕获组(?: 并引用匹配组。

使用re.I 进行不区分大小写的匹配。

import re

def find_t(text):
    return re.search(r'\d{2}:\d{2}(?:am|pm)', text, re.I).group()

您也可以使用re.findall() 进行递归匹配。

def find_t(text):
    return re.findall(r'\d{2}:\d{2}(?:am|pm)', text, re.I)

demo

【讨论】:

    【解决方案2】:

    使用非定界捕获组(?:...)

    >>> from re import findall
    >>> mystr = """
    ... 02:40PM
    ... 12:29AM
    ... """
    >>> findall("\d{2}:\d{2}(?:AM|PM)", mystr)
    ['02:40PM', '12:29AM']
    >>>
    

    此外,您可以将正则表达式缩短为 \d\d:\d\d(?:A|P)M

    【讨论】:

      【解决方案3】:

      当您需要访问组 0 时,听起来您正在访问组 1。

      您的正则表达式中的组如下:

      \d{2}:\d{2}(AM|PM)
                 |-----|  - group 1
      |----------------|  - group 0 (always the match of the entire pattern)
      

      您可以通过以下方式访问整场比赛:

      timePattern.match('02:40PM').group(0)
      

      【讨论】:

        【解决方案4】:

        您没有捕获小时、分钟字段:

        >>> import re
        >>> r = re.compile('(\d{2}:\d{2}(?:AM|PM))')
        >>> r.search('02:40PM').group()
        '02:40PM'
        >>> r.search('Time is 12:29AM').group()
        '12:29AM'
        

        【讨论】:

          【解决方案5】:

          您是否不小心抓住了第一个集群(其中的内容与括号中的模式部分匹配)而不是“第 0 个”集群(即整个匹配项)?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-30
            • 2014-05-06
            • 2011-01-03
            • 1970-01-01
            • 2023-03-10
            • 1970-01-01
            • 2015-07-31
            • 1970-01-01
            相关资源
            最近更新 更多