我正在尝试匹配上午或下午的时间格式。
i.e. 02:40PM
12:29AM
我正在使用以下正则表达式
timePattern = re.compile('\d{2}:\d{2}(AM|PM)')
但它只返回AM
PM
字符串而没有数字。出了什么问题?
答案 0 :(得分:22)
使用非捕获组(?:
并引用匹配组。
使用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
答案 1 :(得分:4)
使用非分隔的捕获组(?:...)
:
>>> 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
。
答案 2 :(得分: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)
答案 3 :(得分: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'
答案 4 :(得分:2)
你是不是意外地抓住第一个集群(其中的东西与括号中的模式部分相匹配)而不是“0st”集群(这是整个匹配)?