2024-06-08 20:51:45 发布
网友
我想知道为什么我的正则表达式不起作用。唯一的工作组是年。 其余的小组都没有
formatted_date = re.search('.*((?P<day>\d{1,2}) )?((?P<month>[a-zA-Z]+) )?(?P<year>\d{4}).*', '10 may 1991')
正则表达式背后的思想是它将处理以下输入:
正则表达式是用Python编写的
提前感谢:)
问题是,模式开头的贪心点匹配子模式将捕获到最后的所有字符,然后回溯生成它必须生成的内容以适应其他子模式。因为前两个是可选的,所以不给它们任何文本
您不需要任何.*,因为re.search不需要完整的字符串匹配
.*
re.search
使用
(?:(?P<day>\d{1,2}) )?(?:(?P<month>[a-zA-Z]+) )?(?P<year>\d{4})
参见regex demo
我还将捕获可选组转换为非捕获,这样匹配对象就更干净了
注意,如果您仍然使用您的方法,您可能会考虑在模式的开头使用.*?(延迟点匹配),但是您必须担心换行(好的,您可以使用re.S标志来解决这个问题),这样,您就可以得到字符串中日期的第一个实例。如果您有多个,并且需要获取最后一个,那么最好的方法是使用re.findall和我建议的模式,只获取结果列表的最后一个元素
.*?
re.S
re.findall
问题是,模式开头的贪心点匹配子模式将捕获到最后的所有字符,然后回溯生成它必须生成的内容以适应其他子模式。因为前两个是可选的,所以不给它们任何文本
您不需要任何
.*
,因为re.search
不需要完整的字符串匹配使用
参见regex demo
我还将捕获可选组转换为非捕获,这样匹配对象就更干净了
注意,如果您仍然使用您的方法,您可能会考虑在模式的开头使用
.*?
(延迟点匹配),但是您必须担心换行(好的,您可以使用re.S
标志来解决这个问题),这样,您就可以得到字符串中日期的第一个实例。如果您有多个,并且需要获取最后一个,那么最好的方法是使用re.findall
和我建议的模式,只获取结果列表的最后一个元素相关问题 更多 >
编程相关推荐