python regex可选捕获组

2024-10-06 10:10:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我在匹配来自如下文件名的所需数据时遇到以下问题:

miniseries.season 1.part 5.720p.avi
miniseries.part 5.720p.avi
miniseries.part VII.720p.avi     # episode or season expressed in Roman numerals

“第二十季”一词可能存在,也可能不存在,或者可以用简短的形式写成,如“s 1”或“sease1”

无论如何,我希望有4个捕捉组作为输出:

group1 : miniseries
group2 : 1 (or None)
group3 : 5
group4 : 720p.avi

所以我写了一个这样的正则表达式:

(^.*)\Ws[eason ]*(\d{1,2}|[ivxlcdm]{1,5})\Wp[art ]*(\d{1,2}|[ivxlcdm]{1,5})\W(.*$)

只有当我有一个完全指定的文件名,包括可选的“季节XX”字符串时,这才有效。 如果找不到“season”,是否可以编写一个返回“None”作为group2的regex?


Tags: or数据innone文件名seasonpartroman
1条回答
网友
1楼 · 发布于 2024-10-06 10:10:41

很容易让赛季组成为可选:

(^.*?)(?:\Ws(?:eason )?(\d{1,2}|[ivxlcdm]{1,5}))?\Wp(?:art )?(\d{1,2}|[ivxlcdm]{1,5})\W(.*$)

使用非捕获组((?:...))加上0或1量词(?)。我必须使第一个组不贪婪,以防止它与名称的season部分匹配。

我还将easonart可选字符串设置为非捕获可选组,而不是字符类。

结果:

>>> 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')

相关问题 更多 >