【问题标题】:Match pattern 1 and/or pattern 2匹配模式 1 和/或模式 2
【发布时间】:2016-12-29 16:19:38
【问题描述】:

我有多个文件名,它们要么是电影名称,要么是电视节目中的一集。对于电影标题,我想匹配电影上映的年份,对于剧集,我想匹配格式为S00E00 的季节和剧集编号。但是,我不知道该字符串包含任何一个,或者有时它可以包含季节和剧集年份。我也不知道字符串中首先出现的是什么,年份或季节和剧集。

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

我有一个解决方案,它使用两个单独的匹配项、if 语句并且通常看起来很难看。有没有一种方法可以让一个正则表达式模式返回一个包含(year, season, episode) 的列表(或元组)女巫,而不管字符串中的第一个是什么?

【问题讨论】:

  • 如果您使用re.findall,它应该会找到所有匹配项。所以2012.S01E02 会给你[('2012', '', ''), ('', '01', '02')]
  • 这比我所拥有的要有用得多,谢谢。我可以更轻松地处理这个结果。
  • 能否请您发布一些输入行和您想要的输出,就像典型的正则表达式问题一样?

标签: python regex


【解决方案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. .*?(\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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多