Regex可以在regextTester上工作,但不能在Python上工作[重复]

uwopmtnx  于 2023-05-01  发布在  Python
关注(0)|答案(1)|浏览(185)

此问题已在此处有答案

re.findall behaves weird(3个答案)
9天前关闭
我试过这个

pattern_time = (
    r"\b\d{1,2}([: .]?)(\d{2})?(\s?)((P|p)?)(.?)((M|m)?)(.?)((next|this)?)(\s?)((tomorrow|today|day|evening|morning|(mid?)night|((after|before)?)(noon))?)\b"
)

test_string = "The meeting is at 3pm today or 5 tomorrow or 7 this afternoon or 00:00 midnight. Let's meet at 11.30 p.M. We can also do 8:45 pm or 1200 hr or 00hr."

matches = re.findall(pattern_time, test_string, re.IGNORECASE)
print(matches)

在Python中获得

[('', '', '', 'p', 'p', 'm', '', '', ' ', '', '', '', 'today', 'today', '', '', '', ''), (' ', '', '', '', '', '', '', '', '', '', '', '', 'tomorrow', 'tomorrow', '', '', '', ''), (' ', '', '', '', '', '', '', '', '', 'this', 'this', ' ', 'afternoon', 'afternoon', '', 'after', 'after', 'noon'), (':', '00', ' ', '', '', '', '', '', '', '', '', '', 'midnight', 'midnight', 'mid', '', '', ''), ('.', '30', ' ', 'p', 'p', '.', 'M', 'M', '.', '', '', ' ', '', '', '', '', '', ''), (':', '45', ' ', 'p', 'p', 'm', '', '', ' ', '', '', '', '', '', '', '', '', ''), ('', '00', ' ', '', '', 'h', '', '', 'r', '', '', ' ', '', '', '', '', '', ''), ('', '', '', '', '', 'h', '', '', 'r', '', '', '', '', '', '', '', '', '')]

但regextest表明它是正确的。
我们如何在Python中纠正这个问题?
谢谢你的帮助。

tzdcorbm

tzdcorbm1#

re.findall将给予每个捕获组的值。要只获取整个匹配,可以使用re.finditer和列表解析。

matches = [m.group() for m in re.finditer(pattern_time, test_string, re.I)]

或者,您可以重新构造正则表达式以使用非捕获组。(这在这里将是乏味的,因为它需要将每个()组替换为(?:)。)
请参阅re.findall的文档:
结果取决于模式中捕获组的数量。如果没有组,则返回匹配整个模式的字符串列表。如果只有一个组,则返回与该组匹配的字符串列表。如果存在多个组,则返回与组匹配的字符串元组的列表。

相关问题