[英]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.