正则表达式(' foo' |' bar')表示法

时间:2016-09-05 16:53:29

标签: python regex

我使用正则表达式来解析一些时间数据,但我的尝试并不像我期望的那样匹配。这是我的代码:

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生成我想要的结果,但这有点生硬,我想知道为什么另一个不起作用?

3 个答案:

答案 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']