Python 正则表达式(';foo';';bar';)表示法
我正在使用正则表达式解析一些时间数据,但我的尝试与我预期的不匹配。这是我的密码:Python 正则表达式(';foo';';bar';)表示法,python,regex,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产生我想要的结果,但这有点直截了当,我想知道为什么另一个不起作用?您的问题与捕获组有关。如果您想进行非捕获交替,请使用正则表达式\d
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
产生我想要的结果,但这有点直截了当,我想知道为什么另一个不起作用?您的问题与捕获组有关。如果您想进行非捕获交替,请使用正则表达式\d+:\d+(?:am | pm)
(强调我的):
re.findall(模式、字符串、标志=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']
您甚至可能不需要正则表达式来拆分这个特定字符串。如果适用,您可以使用常规:
当然,这并不强制要求项目是类似于“时间”的字符串。
re.findall((\d+)(\d+)(\d+(?:am | pm)”,时间字符串)
谢谢!我对术语有点困惑。。。在这种情况下,我不想捕获am/pm吗?如果它没有被捕获,为什么会包含在比赛中?@TomRobbins:所有匹配的东西都是比赛的一部分。捕获组仅允许您提取部分匹配。如果您确实想为匹配设置一个约束,但不想与之匹配,可以使用lookahead。通过向parens添加:?
,它将成为一个非捕获组。如果您只想捕捉时间的前半部分,请将其包装在括号中。像提供的@sudomakeinstall2一样,如果需要,您可以将at捕获组添加到数字部分。
>>> s = "11:30 am - 2:20 pm"
>>> s.split(" - ")
['11:30 am', '2:20 pm']