这些年来我在媒体服务器上收集了大量的电视剧。我编写了一个脚本来检查并使用正确的文件名方案重命名它们,但是在尝试针对多个命名方案时,我在正则表达式方面遇到了一些问题。
这是我当前的函数,它非常适合使用方案“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
最佳答案
文件名不包含'\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
具有 bool 值 False
,因此您可以使用 epsiode = getEpisode(filename); 测试是否不匹配。如果情节:...
.
关于python - 在Python中使用正则表达式从文件名中获取剧集编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9129329/