在Python中使用正则表达式从文件名提取剧集号

4 投票
2 回答
5312 浏览
提问于 2025-04-17 12:15

我这些年来在媒体服务器上收集了很多电视剧。我写了一个脚本,想把它们的文件名都改成合适的格式,但在处理多个命名规则时,正则表达式遇到了一些麻烦。

这是我目前的函数,它能很好地从文件名中提取出“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的正则工具上,这些都能正常工作。

但是当我把它放进我的函数里时,它却不工作了。这让我很困惑,因为在我上面提到的Python正则工具里,它是可以正常运行的。任何帮助都将非常感激。

补充说明:以下是一些文件使用的命名规则示例。

Series Name s01e01.avi

Series Name 1x01.avi

Series Name episode 01.avi

01 Episode Title.avi

2 个回答

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

文件名里没有包含 '\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,所以你可以用 episode = getEpisode(filename); if episode: ... 来检查是否有匹配的结果。

撰写回答