正则表达式 - 如何识别模式直到找到第二个模式

时间:2011-12-01 16:55:14

标签: python regex

我有一个名为特定方式的文件。让我们说是:

tv_show.s01e01.episode_name.avi

这是电视节目剧集的视频文件在网上命名的标准方式。整个网络上的模式完全相同,所以我想从这样命名的文件中提取一些信息。基本上我想得到:

  1. 节目的标题;
  2. 季节编号s01;
  3. 剧集编号e01;
  4. 扩展名。
  5. 我正在使用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。我知道,我没有在示例中加入扩展代码,但这不是我的问题,所以没关系。

3 个答案:

答案 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是最右边的。