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

2024-06-08 20:51:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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编写的

提前感谢:)


Tags: researchdate小组yearmay工作组思想
1条回答
网友
1楼 · 发布于 2024-06-08 20:51:45

问题是,模式开头的贪心点匹配子模式将捕获到最后的所有字符,然后回溯生成它必须生成的内容以适应其他子模式。因为前两个是可选的,所以不给它们任何文本

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

使用

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

参见regex demo

我还将捕获可选组转换为非捕获,这样匹配对象就更干净了

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

相关问题 更多 >