我有一个名为特定方式的文件。让我们说是:
tv_show.s01e01.episode_name.avi
这是电视节目剧集的视频文件在网上命名的标准方式。整个网络上的模式完全相同,所以我想从这样命名的文件中提取一些信息。基本上我想得到:
s01
; e01
; 我正在使用Python 3脚本来执行此操作。这个测试文件非常简单,因为我所要做的就是这个
import re
def acquire_info(f="tv_show.s01e01.episode_name.avi"):
tvshow_title = title_p.match(f).group()
numbers = numbers_p.search(f).group()
season_number = numbers.split("e")[0].split("s")[1]
ep_number = numbers.split("e")[1]
return [tvshow_title, season_number, ep_number]
if __name__ == '__main__':
# re.I stands for the option "ignorecase"
title_p = re.compile("^[a-z]+", re.I)
numbers_p = re.compile("s\d{1,2}e\d{1,2}", re.I)
print(acquire_info())
,输出符合预期['tv_show', '01', '01']
。但是,如果我的文件名与其他文件名相同怎么办? some.other.tv.show.s04e05.episode_name.avi
。
如何构建一个正则表达式,以便找到所有文本之前 "s\d{1,2}e\d{1,2}"
模式?
P.S。我知道,我没有在示例中加入扩展代码,但这不是我的问题,所以没关系。
答案 0 :(得分:2)
试试这个
show_p=re.compile("(.*)\.s(\d*)e(\d*)")
show_p.match(x).groups()
其中x是你的字符串
编辑**(我忘了包含扩展名,这是修订版)
show_p=re.compile("^(.*)\.s(\d*)e(\d*).*?([^\.]*)$")
show_p.match(x).groups()
以下是测试结果
>>> show_p=re.compile("(.*)\.s(\d*)e(\d*).*?([^\.]*)$")
>>> x="tv_show.s01e01.episode_name.avi"
>>> show_p.match(x).groups()
('tv_show', '01', '01', 'avi')
>>> x="tv_show.s2e1.episode_name.avi"
>>> show_p.match(x).groups()
('tv_show', '2', '1', 'avi')
>>> x='some.other.tv.show.s04e05.episode_name.avi'
>>> show_p.match(x).groups()
('some.other.tv.show', '04', '05', 'avi')
>>>
答案 1 :(得分:1)
这是一个选项,使用捕获组一步提取所需的所有信息:
>>> show_p = re.compile(r'(.*?)\.s(\d{1,2})e(\d{1,2})')
>>> show_p.match('some.other.tv.show.s04e05.episode_name.avi').groups()
('some.other.tv.show', '04', '05')
答案 2 :(得分:0)
我不是Python专家,但是如果它可以进行命名捕获,那么像这样的通用可能会起作用:
^(?<Title>.+)\.s(?<Season>\d{1,2})e(?<Episode>\d{1,2})\..*?(?<Extension>[^.]+)$
如果没有命名组,只需使用普通组。
如果标题的.s2e1.
部分掩盖了真实的季节/剧集部分,则可能会出现问题。这需要更多的逻辑。上面的正则表达式假定标题/季节/剧集/扩展名存在,而s / e是最右边的。