在Python中使用正则表达式从文件名提取剧集号
我这些年来在媒体服务器上收集了很多电视剧。我写了一个脚本,想把它们的文件名都改成合适的格式,但在处理多个命名规则时,正则表达式遇到了一些麻烦。
这是我目前的函数,它能很好地从文件名中提取出“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: ...
来检查是否有匹配的结果。