我有多个文件名,可以是电影节目中的电影片名或剧集。对于我希望与电影出现的年份相匹配的电影,我想要以S00E00
格式匹配季节和剧集编号。但是,我不知道该字符串包含或者,有时它可以包含季节和剧集和年份。我也不知道弦乐,年份或季节和剧集中的第一个。
我尝试使用以下模式:(\d{4})|S(\d\d)E(\d\d)
,但是只返回第一个匹配的匹配项。对于字符串2012.S01E02
,它返回2012
,对于字符串S01E02.2012
,它返回S01E02
。其余的捕获组是None
(我使用的是Python 3.5)。
我有一个解决方案,使用两个单独的匹配,if语句,通常看起来很难看。有没有办法让一个正则表达式模式返回包含(year, season, episode)
的列表(或元组),无论字符串中的第一个是什么?
答案 0 :(得分:1)
您可以使用以下正则表达式:
.*?(\d{4}).*?(S\d{2}E\d{2}).*?|.*?(S\d{2}E\d{2}).*?(\d{4}).*?|.*?(S\d{2}E\d{2}).*?|.*?(\d{4}).*?
.*?(\d{4}).*?(S(\d\d)E(\d\d)).*?
:这将首先匹配此订单中年份和剧集编号的组合。.*?(S(\d\d)E(\d\d)).*?(\d{4}).*?
:这将与相反的顺序匹配.*?(S(\d\d)E(\d\d)).*?
:这将与剧集编号.*?(\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);