2016-12-29 79 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);

如果使用