我一直在努力获得一个正则表达式来获取电视节目或电影名称,如果它存在的那一年播出的那一年,季节#和来自视频文件名的剧集#。我有一个正则表达式(下面)似乎适用于电影和电视节目的双年日期(其中一年是节目/电影名称,另一年是播出的一年)的节目。对于电视节目,如果格式为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})
这是我正在使用的测试数据
正则表达式无法正常使用以下测试数据:
更新:这是基于评论的新表达式。它工作得更好,但正在努力处理表达式下面列出的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
)
|$)
答案 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)
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