【发布时间】:2014-09-12 11:57:00
【问题描述】:
我一直在努力获取一个正则表达式来从视频的文件名中获取电视节目或电影名称、播出年份(如果存在)、季节#和剧集#。对于电影和电视节目,我有一个正则表达式(如下)似乎适用于具有双年日期的节目(其中一个年份在节目/电影名称中,另一个是它播出的年份)。对于电视节目,如果格式为 SXEXXX 或 XXX,它可以获取季节和剧集编号。我一直在regex101.com 测试引擎中对其进行测试。我苦苦挣扎的地方是,如果文件名中不存在年份,则表达式将不会返回任何内容。此外,如果文件名有一个 4 位数字,它实际上是节目名称的一部分,它认为这是播出的年份日期(即“4400”)。如何修改此表达式以能够处理我描述的额外条件?
最终目标是我想将它放入一个 python 脚本中,如果文件是电影或电视节目,该脚本会查询像 TheTVDB.com 这样的网站,以便我可以将庞大的视频库分类到电视节目和电影文件夹中。
(?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
- 空间 1999 1975
- 空间:1999 (1975)
- Space.1999.1975.S01E01
- 空间 1999.(1975)
- .4400.204.mkv
- 空间 1999 (1975) v.2009.S01E13.the.title.avi
- Teen.wolf.S04E12.HDTV.x264
- Se7en.(1995).avi
- 如何训练你的龙 2
正则表达式不适用于以下测试数据:
- .4400.204.mkv
- Teen.wolf.S04E12.HDTV.x264
- 如何训练你的龙 2
更新:这是基于 cmets 的新表达式。它的效果要好得多,但在表达式下方列出的 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
【问题讨论】:
-
很难说出所有这些变化是什么,尤其是现在添加的示例。
v.2009.S01E13.the.title.avi和archer.2009.S04E13的节目/年份/剧集部分是什么? -
它应该与
space 1999 (1975) v.2009.S01E13.the.title.avi做什么?节目名称是什么? 2009 年是一年吗? -
如果输入的文件名是v.2009.S01E13.the.title.avi。我的预期输出是 ShowName = v,Year = 2009,Season = 01,Episode = 13。空间 1999(1975)也是如此。 ShowName = 空间 1999,年份 = 1975
-
好的,这说明了一件事,但
space 1999 (1975) v.2009.S01E13.the.title.avi是您列表中的一项。那应该是两个独立的项目吗?那会更有意义。 -
我已更新列表以使这些文件名成为单独的项目