Python正则表达式匹配OR操作符

18

我正在尝试匹配AM或PM格式的时间。

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

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

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

但它只返回了带有 AMPM 字符串而没有数字。出了什么问题?


也许使用捕获组 - Tommy
@Tommy:他正在使用捕获组,这就是问题的原因。当正则表达式具有捕获组时,findall()仅返回这些组,而不是完整匹配。 - Alan Moore
1
请注意,您也可以完全避免使用该组,将 (AM|PM) 改为 [AP]M - ShadowRanger
5个回答

42

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

使用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)

请查看演示


7

使用非分组捕获 (?:...)

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

4

听起来你正在访问第1组,但你需要访问第0组。

你正则表达式中的组如下所示:

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

您可以通过以下方式访问整个匹配:

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

2

你是否意外地抓取了第一个簇(与括号中模式相匹配的内容),而不是“0st”簇(即整个匹配)?


2

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

>>> 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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接