15

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

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

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

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

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

4

5 回答 5

36

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

用于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

于 2013-11-06T20:09:10.823 回答
7

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

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

此外,您可以将 Regex 缩短为\d\d:\d\d(?:A|P)M.

于 2013-11-06T19:56:23.363 回答
4

当您需要访问组 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)
于 2013-11-06T19:57:56.470 回答
3

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

>>> 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'
于 2013-11-06T19:56:19.487 回答
2

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

于 2013-11-06T19:56:46.567 回答