我有以下问题匹配文件名中所需的数据,如下所示:
miniseries.season 1.part 5.720p.avi
miniseries.part 5.720p.avi
miniseries.part VII.720p.avi # episode or season expressed in Roman numerals
Run Code Online (Sandbox Code Playgroud)
"季节XX"块可能存在也可能不存在,或者可能以简短形式书写,如"s 1"或"sea 1"
在任何情况下,我都希望有4个捕获组作为输出:
group1 : miniseries
group2 : 1 (or None)
group3 : 5
group4 : 720p.avi
Run Code Online (Sandbox Code Playgroud)
所以我写了一个像这样的正则表达式:
(^.*)\Ws[eason ]*(\d{1,2}|[ivxlcdm]{1,5})\Wp[art ]*(\d{1,2}|[ivxlcdm]{1,5})\W(.*$)
Run Code Online (Sandbox Code Playgroud)
这只适用于我有一个完全指定的文件名,包括可选的"季节XX"字符串.如果找不到"季节",是否可以编写一个正则表达式返回"无"作为group2?
Mar*_*ers 43
使季节组可选是很容易的:
(^.*?)(?:\Ws(?:eason )?(\d{1,2}|[ivxlcdm]{1,5}))?\Wp(?:art )?(\d{1,2}|[ivxlcdm]{1,5})\W(.*$)
Run Code Online (Sandbox Code Playgroud)
使用非捕获组((?:...))加上0或1个量词(?).我必须让第一组非贪婪,以防止它匹配season名称的部分.
我也做了eason和art可选的字符串到非捕获可选组,而不是字符类.
结果:
>>> import re
>>> p=re.compile(r'(^.*?)(?:\Ws(?:eason )?(\d{1,2}|[ivxlcdm]{1,5}))?\Wp(?:art )?(\d{1,2}|[ivxlcdm]{1,5})\W(.*$)', re.I)
>>> p.search('miniseries.season 1.part 5.720p.avi').groups()
('miniseries', '1', '5', '720p.avi')
>>> p.search('miniseries.part 5.720p.avi').groups()
('miniseries', None, '5', '720p.avi')
>>> p.search('miniseries.part VII.720p.avi').groups()
('miniseries', None, 'VII', '720p.avi')
Run Code Online (Sandbox Code Playgroud)