繁体   English   中英

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

[英]Regex ('foo'|'bar') notation

我正在使用正则表达式来解析一些时间数据,但是我的尝试与预期不符。 这是我的代码:

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产生我想要的结果,但这有点钝了,我想知道为什么另一个不能正常工作?

您的问题与捕获组有关。 如果您想进行非捕捉式轮换,请使用regex \\d+:\\d+ (?:am|pm)

您甚至可能不需要正则表达式来拆分此特定字符串。 如果适用,可以使用常规的str.split()

>>> s = "11:30 am - 2:20 pm"
>>> s.split(" - ")
['11:30 am', '2:20 pm']

当然,这不会将项目强制为类似于“时间”的字符串。

引用文档重点是我的 ):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM