2011-08-29 52 views
2

我試圖格式匹配(在Python)從電視節目的文件名的節目名稱和季節/集數:如何停止python的正則表達式是太貪婪

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 Two0802。然而,Show One中的720意味着我回到720季節/劇集。

如果我在[XxEe]之後刪除?,那麼它會匹配這兩種類型,但我希望該範圍對於不包含情節標識符的文件名是可選的。

我試過使用??來阻止[XxEe]匹配貪婪,如python文檔re模塊部分所列,但這沒有效果。

如何捕獲系列名稱部分和季節/情節部分,而忽略字符串的其餘部分?

+5

你可能會更好地做'name.split('。') ',然後通過從頭到尾反向工作來分開它。 –

+0

我最初使用'split()',但我不能保證文件將被'.'分隔,並且在季節/劇集編號之前的項目數目將是可變的。 – ghickman

回答

3

變化首場比賽greedity:

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')] 

注意?以下+在第一組。

說明:

首場比賽吃太多,以免降低其greedity作出如下匹配越快。 (順便說一句,這不是一個很好的例子,我會改變名稱,因爲他們肯定聽起來有點太Warezzz-y ;-))

+0

啊,是的,這是一個公平的觀點,並沒有真正想到這一點!感謝指針。 – ghickman

+1

雖然這會讓你走上正軌,但你應該注意到,它會在名稱包含3-4位數的邊緣情況下失敗(例如Some.Show.2011.S01E05.Some.Title.HDTV.XviD),因爲你使S和EeXx都可選。您需要將這些分解爲由|分隔的兩個不同語句爲了避免這一點。 – Till

+0

糾正我上面的陳述,只是從[EeXx]中刪除選擇性:(?P [\ w \ s。,_-] +?)\。[Ss]?(?P [\ d] {1, 2})[EeXx](?P [\ d] {2})\。 – Till

0

在表達式的末尾添加一個點:

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

嘗試:

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