使用Regex匹配电视和电影文件名称

时间:2014-09-12 11:57:01

标签: regex regex-lookarounds

我一直在努力获得一个正则表达式来获取电视节目或电影名称,如果它存在的那一年播出的那一年,季节#和来自视频文件名的剧集#。我有一个正则表达式(下面)似乎适用于电影和电视节目的双年日期(其中一年是节目/电影名称,另一年是播出的一年)的节目。对于电视节目,如果格式为SXXEXX或XXX,则能够获取季节和剧集编号。我一直在regex101.com测试引擎中测试它。在我努力的地方,如果文件名中不存在一年,表达式将不会返回任何内容。此外,如果文件名具有4位数字,它实际上是节目名称的一部分,则认为是播出的年份日期(即“4400”)。如何修改此表达式以便能够处理我描述的额外条件?

最终目标是我想把它放到一个python脚本中,如果文件是电影或电视节目,它会查询像TheTVDB.com这样的网站,以便我可以将我庞大的视频库分类为电视节目和电影文件夹。 / p>

(?P<ShowName>.*)[ (_.]#Show Name
       (?=19[0-9]\d|20[0-4]\d|2050) #If after the show name is a year
          (?P<ShowYear>\d{4,4}) # Get the show year
          | # Else
          (?=S\d{1,2}E\d{1,2}) 
             S(?P<Season>\d{1,2})E(?P<Episode>\d{1,2}) #Get the season and Episode information
             |
             (\d{1})E(\d{1,2})

这是我正在使用的测试数据

  • archer.2009.S04E13
  • space 1999 1975
  • 空间:1999(1975)
  • Space.1999.1975.S01E01
  • space 1999.(1975)
  • The.4400.204.mkv
  • space 1999(1975)v.2009.S01E13.the.title.avi
  • Teen.wolf.S04E12.HDTV.x264
  • 七宗罪。(1995)的.avi
  • 如何训练你的龙2

正则表达式无法正常使用以下测试数据:

  • The.4400.204.mkv
  • Teen.wolf.S04E12.HDTV.x264
  • 如何训练你的龙2

更新:这是基于评论的新表达式。它工作得更好,但正在努力处理表达式下面列出的3个文件名。

(?P<ShowName>.*)#Show Name
(
   [ (_.]
   (
       (?=\d{4,4}) #If after the show name is a year
          (?P<ShowYear>\d{4})  # Get the show year
          | # Else no year in the file name then just grab the name
          (?P<otherShowName>.*) # Grab Show Name
          (?=S\d{1,2}E\d{1,2}) # If the Season Episode patterns matches SX{1,2}EX{1,2}, Then
             S(?P<Season>\d{1,2})E(?P<Episode>\d{1,2}) #Get the season and Episode information
             | # Else
             (?P<Alt_S_E>\d{3,4}) # Get the season and Episode that looks like 211
   )
|$)
  • Se7en
  • 10,000BC(2010)
  • v.2009.S01E13.the.title.avi
  • archer.2009.S04E13

2 个答案:

答案 0 :(得分:2)

我对你的正则表达式进行了一些修改,如果我理解正确的话,它似乎有效。

^(
  (?P<ShowNameA>.*[^ (_.]) # Show name
    [ (_.]+
    ( # Year with possible Season and Episode
      (?P<ShowYearA>\d{4})
      ([ (_.]+S(?P<SeasonA>\d{1,2})E(?P<EpisodeA>\d{1,2}))?
    | # Season and Episode only
      (?<!\d{4}[ (_.])
      S(?P<SeasonB>\d{1,2})E(?P<EpisodeB>\d{1,2})
    | # Alternate format for episode
      (?P<EpisodeC>\d{3})
    )
|
  # Show name with no other information
  (?P<ShowNameB>.+)
)

请参阅regex101

上的演示

编辑:我已更新正则表达式,以处理您在评论中提到的最后3种情况。

一个主要问题是你在主要轮换期间没有任何parens,所以它包括整个正则表达式。我还必须添加一个替换,以允许名称后面没有年份/剧集格式。

因为你有很多不同的可能布局可能会相互冲突,所以正则表达式最终会有很多不同场景的交替。例如,为了匹配一个完全没有年份或剧集信息的标题,我不得不在整个正则表达式中添加一个替换,如果它找不到任何已知的模式,只需匹配整个事物。

注意:现在您似乎已经扩展了显示年份以匹配任何四位数字,因此不需要前瞻。换句话说,(?=\d{4,4})(?P<ShowYear>\d{4})(?P<ShowYear>\d{4})相同。这也意味着您的剧集的替代格式必须仅匹配3位数,而不是4.否则,无法将独立的4位数序列区分为年份或剧集。

一般模式:

[ (_.]+                   the delimiter used throughout
(?P<ShowNameA>.*[^ (_.])  the show name, greedy but not including a delimiter
(?P<ShowNameB>.+)         the show name when it's the whole line

格式A(有可能的季节和剧集的年份):

(?P<ShowYearA>\d{4})
([ (_.]+S(?P<SeasonA>\d{1,2})E(?P<EpisodeA>\d{1,2}))?

格式B(仅限季节和剧集):

(?<!\d{4}[ (_.])
S(?P<SeasonB>\d{1,2})E(?P<EpisodeB>\d{1,2})

格式C(剧集的替代格式):

(?P<EpisodeC>\d{3})

答案 1 :(得分:0)

如果可以的话,我会调整brian的正则表达式以匹配像

这样的东西

SHOW.NAME.201X.SXXEXX.XSUB.VOSTFR.720p.HDTV.x264-ADDiCTiON.mkv

这是(PHP PCRE)

/^(
    (?P<ShowNameA>.*[^ (_.]) # Show name
        [ (_.]+
        ( # Year with possible Season and Episode
            (?P<ShowYearA>\d{4})
            ([ (_.]+S(?P<SeasonA>\d{1,2})E(?P<EpisodeA>\d{1,2}))?
        | # Season and Episode only
            (?<!\d{4}[ (_.])
            S(?P<SeasonB>\d{1,2})E(?P<EpisodeB>\d{1,2})
        )
|
        # Show name with no other information
        (?P<ShowNameB>.+)
)/mx