我使用正则表达式来解析一些时间数据,但我的尝试并不像我期望的那样匹配。这是我的代码:
import re
print re.findall("\d+:\d+ (am|pm)", "11:30 am - 2:20 pm")
这会产生['am', 'pm']
,而不是['11:30 am', '2:20 pm']
,这就是我想要的。
我可以使用\d+:\d+ am|\d+:\d+ pm
生成我想要的结果,但这有点生硬,我想知道为什么另一个不起作用?
答案 0 :(得分:4)
您的问题与捕获群组有关。如果您想要进行非捕获更改,请使用正则表达式\d+:\d+ (?:am|pm)
。
答案 1 :(得分:1)
你可能甚至不需要正则表达式来分割这个特定的字符串。如果适用,您可以使用常规str.split()
:
>>> s = "11:30 am - 2:20 pm"
>>> s.split(" - ")
['11:30 am', '2:20 pm']
当然,这并不强制项目是"时间"类似字符串。
答案 2 :(得分:0)
Quoting docs(强调我的):
re.findall(pattern, string, flags=0)
返回字符串中所有非重叠的模式匹配,作为列表 字符串。从左到右扫描字符串,并返回匹配项 按顺序找到。 如果模式中存在一个或多个组, 返回一个组列表;如果模式,这将是一个元组列表 有多个组。结果中包含空匹配 除非他们触及另一场比赛的开始。
您可以使用re.finditer
:
seq = [m.string[m.start():m.end()] for m in re.finditer("\d+:\d+ (am|pm)", "11:30 am - 2:20 pm")]
# ['11:30 am', '2:20 pm']