此问题已在此处有答案:
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中纠正这个问题?
谢谢你的帮助。
1条答案
按热度按时间tzdcorbm1#
re.findall
将给予每个捕获组的值。要只获取整个匹配,可以使用re.finditer
和列表解析。或者,您可以重新构造正则表达式以使用非捕获组。(这在这里将是乏味的,因为它需要将每个
()
组替换为(?:)
。)请参阅
re.findall
的文档:结果取决于模式中捕获组的数量。如果没有组,则返回匹配整个模式的字符串列表。如果只有一个组,则返回与该组匹配的字符串列表。如果存在多个组,则返回与组匹配的字符串元组的列表。