如何阻止python正则表达式过于贪婪

时间:2011-08-29 14:08:26

标签: python regex

我正试图以(格式化)电视剧集文件名中的节目名称和季节/剧集编号进行匹配,格式为:

Show.One.S01E05.720p.HDTV.x264-CTU.mkv

Show.Two.S08E02.HDTV.XviD-LOL.avi

我的正则表达式:

(?P<show>[\w\s.,_-]+)\.[Ss]?(?P<season>[\d]{1,2})[XxEe]?(?P<episode>[\d]{2})

在Show Two上正确匹配,为我提供Show Two0802。然而,Show One中的720意味着我会在季节/剧集中找回720

如果我在?之后删除了[XxEe],那么它会匹配这两种类型,但我希望该范围对于不包含剧集标识符的文件名是可选的。

我已尝试使用??来阻止[XxEe]匹配贪婪,如python docs re模块部分所列,但这没有效果。

如何在忽略字符串的其余部分的同时捕获系列名称部分和季节/剧集部分?

3 个答案:

答案 0 :(得分:3)

改变第一场比赛的贪婪:

 p=re.compile('(?P<show>[\w\s.,_-]+?)\.[Ss]?(?P<season>[\d]{1,2})[XxEe]?(?P<episode>[\d]{2})')
 print p.findall("Game.of.Thrones.S01E05.720p.HDTV.x264-CTU.mkv")
 [('Game.of.Thrones', '01', '05')]
 print p.findall("Entourage.S08E02.HDTV.XviD-LOL.avi")
 [('Entourage', '08', '02')]

请注意第一组中?之后的+

说明:

第一场比赛吃得太多,所以减少贪婪会使得以下比赛更快。 (顺便说一下,这不是一个非常好的例子,我会更改名称,因为他们肯定听起来有点太坦诚了;-))

答案 1 :(得分:1)

尝试:

                    v
(?P<show>[\w\s.,_-]+?)\.[Ss]?(?P<season>[\d]{1,2})[XxEe]?(?P<episode>[\d]{2})

答案 2 :(得分:0)

在正则表达式的末尾添加一个点:

(?P<show>[\w\s.,_-]+)\.[Ss]?(?P<season>[\d]{1,2})[XxEe]?(?P<episode>[\d]{2})\.
                                                                      here __^