首页 > 解决方案 > Python re.findall 只返回部分模式

问题描述

我正在编写一个 Python 3 程序来跟踪与客户相处的时间。记录小时数的一种方法是使用字符串Client 9:35am 1:35pm,例如第一次是开始,第二次是结束。

为了从字符串中提取时间,我使用regex101.com构造了以下模式:

r"[01]?[0-9]:[0-5][0-9]\s*([Aa][Mm]?|[Pp][Mm]?)"

在使用 regex101 对上述示例进行测试时,它正确地将两次识别为两个单独的匹配项。但是,当尝试在 Python 中使用该模式时,re.findall 返回的列表仅包含 AM 或 PM:

re.findall(r"[01]?[0-9]:[0-5][0-9]\s*([Aa][Mm]?|[Pp][Mm]?)", "Client 9:35am 1:35pm")
['am', 'pm']

如何更改此设置以使匹配包含整个时间?

标签: pythonregex

解决方案


使用非捕获组

r"[01]?[0-9]:[0-5][0-9]\s*(?:[Aa][Mm]?|[Pp][Mm]?)"  # not the "?:"

re.findall如果模式包含捕获组,则返回组列表而不是整个匹配项。


推荐阅读