2016-12-29 136 views
0

我有多個文件名稱,可以是電影節目中的電影標題或劇集。對於我希望匹配電影出場年份的電影片名,以及我想要匹配格式爲S00E00格式的季節和劇集編號的劇集。但是,我不知道該字符串是否包含或者有時可以包含季節和情節年。我也不知道絃樂,年份,季節和情節的第一位。匹配模式1和/或模式2

我試着用下面的模式:(\d{4})|S(\d\d)E(\d\d),但是隻返回匹配的第一個匹配。對於字符串2012.S01E02,它返回2012,對於字符串S01E02.2012它返回S01E02。其餘的捕獲組是None(我使用Python 3.5)。

我有一個解決方案,它使用兩個單獨的匹配,if語句,通常看起來很醜。是否有一種方法可以讓一個正則表達式模式返回一個包含(year, season, episode)的列表(或元組),而不管字符串中的第一個字符是什麼?

+3

're.findall'它應該找到每一場比賽。所以'2012.S01E02'會給你'[('2012','',''),('','01','02')]' –

+0

這比我有更多的用處,謝謝。我可以更輕鬆地處理這個結果。 –

+0

你可以請一些輸入行和你想要的輸出,就像典型的正則表達式問題一樣嗎? –

回答

0

您可以使用以下正則表達式:

.*?(\d{4}).*?(S\d{2}E\d{2}).*?|.*?(S\d{2}E\d{2}).*?(\d{4}).*?|.*?(S\d{2}E\d{2}).*?|.*?(\d{4}).*? 
  1. .*?(\d{4}).*?(S(\d\d)E(\d\d)).*?:這將今年第一和集數的組合匹配順序。
  2. .*?(S(\d\d)E(\d\d)).*?(\d{4}).*?:這將匹配相反的順序
  3. .*?(S(\d\d)E(\d\d)).*?:這將匹配集編號
  4. .*?(\d{4}).*?:這將匹配的一年。

如果按此順序執行正則表達式,您將始終同時獲得年份和劇集編號。

var regex = /.*?(\d{4}).*?(S\d{2}E\d{2}).*?|.*?(S\d{2}E\d{2}).*?(\d{4}).*?|.*?(S\d{2}E\d{2}).*?|.*?(\d{4}).*?/; 
 

 
var matches = "test|S02E12|2012_test".match(regex); 
 
matches = matches.filter(function(item) { 
 
    return item !== undefined; 
 
}).splice(1).sort(); 
 

 
console.log(matches);

如果使用