我想知道为什么我的正则表达式不起作用。它唯一的工作组是年。 其余的组都是无。
formatted_date = re.search('.*((?P<day>\d{1,2}) )?((?P<month>[a-zA-Z]+) )?(?P<year>\d{4}).*', '10 may 1991')
正则表达式背后的想法是它将适用于以下输入:
正则表达式是用Python编写的。
提前致谢:)
答案 0 :(得分:2)
问题是模式开头的贪婪点匹配子模式会抓取所有字符直到最后,然后回溯产生它必须产生的东西以适应其他子模式。由于前两个是可选的,因此没有给出任何文本。
您不需要任何.*
,因为re.search
不需要完整的字符串匹配。
使用
(?:(?P<day>\d{1,2}) )?(?:(?P<month>[a-zA-Z]+) )?(?P<year>\d{4})
请参阅regex demo
我还将捕获的可选组转换为非捕获,以便匹配对象更清晰。
请注意,如果你仍然使用你的方法,你可以考虑在模式的开头使用.*?
(懒点匹配),但是你必须担心换行(好吧,你可以使用{{ 1}}用于解决该问题的标志),这样,您就可以在字符串中获得日期的第一个实例。如果您有多个,并且需要获取最后一个,最好的方法是使用re.S
和我建议的模式,然后获取结果列表的最后一个元素。