正则表达式不与组中的组一起工作

时间:2016-04-12 12:17:27

标签: python regex

我想知道为什么我的正则表达式不起作用。它唯一的工作组是年。 其余的组都是无。

formatted_date = re.search('.*((?P<day>\d{1,2}) )?((?P<month>[a-zA-Z]+) )?(?P<year>\d{4}).*', '10 may 1991')

正则表达式背后的想法是它将适用于以下输入:

  • 1991年5月10日
  • 1991年5月
  • 1991

正则表达式是用Python编写的。

提前致谢:)

1 个答案:

答案 0 :(得分:2)

问题是模式开头的贪婪点匹配子模式会抓取所有字符直到最后,然后回溯产生它必须产生的东西以适应其他子模式。由于前两个是可选的,因此没有给出任何文本。

您不需要任何.*,因为re.search不需要完整的字符串匹配。

使用

(?:(?P<day>\d{1,2}) )?(?:(?P<month>[a-zA-Z]+) )?(?P<year>\d{4})

请参阅regex demo

我还将捕获的可选组转换为非捕获,以便匹配对象更清晰。

请注意,如果你仍然使用你的方法,你可以考虑在模式的开头使用.*?(懒点匹配),但是你必须担心换行(好吧,你可以使用{{ 1}}用于解决该问题的标志),这样,您就可以在字符串中获得日期的第一个实例。如果您有多个,并且需要获取最后一个,最好的方法是使用re.S和我建议的模式,然后获取结果列表的最后一个元素。