匹配模式1和/或模式2

时间:2016-12-29 16:19:38

标签: python regex

我有多个文件名,可以是电影节目中的电影片名或剧集。对于我希望与电影出现的年份相匹配的电影,我想要以S00E00格式匹配季节和剧集编号。但是,我不知道该字符串包含或者,有时它可以包含季节和剧集年份。我也不知道弦乐,年份或季节和剧集中的第一个。

我尝试使用以下模式:(\d{4})|S(\d\d)E(\d\d),但是只返回第一个匹配的匹配项。对于字符串2012.S01E02,它返回2012,对于字符串S01E02.2012,它返回S01E02。其余的捕获组是None(我使用的是Python 3.5)。

我有一个解决方案,使用两个单独的匹配,if语句,通常看起来很难看。有没有办法让一个正则表达式模式返回包含(year, season, episode)的列表(或元组),无论字符串中的第一个是什么?

1 个答案:

答案 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}).*?
  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. 相匹配
  5. .*?(\d{4}).*?:这将与年份匹配。
  6. 如果按此顺序执行正则表达式,您将始终同时获得年份和剧集编号。

    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);