在python中使用regex从文件名中获取剧集编号

时间:2012-02-03 13:23:25

标签: python regex

多年来,我在媒体服务器上收集了大量电视剧。当我和我的兄弟从DVD中剥离它们时,我们从未使用过固定的命名方案,因此文件名中的剧集编号在节目之间的方案中有所不同。我写了一个脚本来通过并使用适当的文件名方案重命名它们,但是在尝试定位多个命名方案时,我在使用正则表达式时遇到了一些麻烦。

这是我目前的功能,适用于使用方案“s01e01”从文件名中获取剧集编号

def getEpisode(filename):
    matches = re.findall(r"e[0-9][0-9]", filename)
    if len(matches) == 1:
        episode = matches[0]
        episode = stripEp(episode)
        return episode  
    else:
        return False

def stripEp(target):
    target = target.strip()
    target = target.strip('abcdefghijklmnopqrstuvwxyz.')
    return target

我需要做的是在使用多个方案时从文件名中获取剧集编号。我花了一段时间谷歌搜索并尝试以下。

matches = re.findall(r"(e[0-9][0-9]|E[0-9][0-9]|x[0-9][0-9]|X[0-9][0-9]|episode [0-9][0-9]|Episode [0-9][0-9]|\n[0-9][0-9])", filename)

这适用于RegexPal和Python Regex Tool

等正则表达式测试人员

然而,当我将其插入我的功能时,它不起作用。这让我很难过,因为它似乎适用于我上面链接的python正则表达式工具。任何帮助将不胜感激。

编辑:以下是文件使用的方案的一些示例。

Series Name s01e01.avi

Series Name 1x01.avi

Series Name episode 01.avi

01 Episode Title.avi

2 个答案:

答案 0 :(得分:1)

只是为了清晰的正则表达式

re.findall(r"(?:e|x|episode|\n)(\d{2})", filename, re.I)

并获得季节

re.findall(r"(?:s|season)(\d{2})(?:e|x|episode|\n)(\d{2})", filename, re.I)

答案 1 :(得分:1)

文件名不包含'\n'。您可以使用^来表示字符串的开头,而不是:

def getEpisode(filename):
    match = re.search(
        r'''(?ix)                 # Ignore case (i), and use verbose regex (x)
        (?:                       # non-grouping pattern
          e|x|episode|^           # e or x or episode or start of a line
          )                       # end non-grouping pattern 
        \s*                       # 0-or-more whitespaces
        (\d{2})                   # exactly 2 digits
        ''', filename)
    if match:
        return match.group(1)

tests = (
    'Series Name s01e01.avi',
    'Series Name 1x01.avi',
    'Series Name episode 01.avi',
    '01 Episode Title.avi'
    )
for filename in tests:
    print(getEpisode(filename))

产量

01
01
01
01

我删除了else: return False,因为Python返回None,如果它到达函数的末尾而没有返回任何内容。由于None的布尔值为False,因此您可以测试与epsiode = getEpisode(filename); if episode: ...不匹配。