Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式(';foo';';bar';)表示法_Python_Regex - Fatal编程技术网

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