使用正则表达式批量重命名电影

使用正则表达式批量重命名电影

我一直在尝试使用正则表达式重命名一些电影文件,但到目前为止,我只取得了一点成功。目标是解析如下文件:

2001.A.Space.Odyssey.1968.720p.BluRay.DD5.1.x264-LiNG.mkv

并重命名如下:

2001 A Space Odyssey (1968).mkv

我创建了以下模式:^(.+)\.(\d{4}).+\.(mp4|avi|mkv)$

输出如下:\1 (\2).\3

现在,当我的电影标题只有一个单词时,这种方法可以很好地工作,但是当电影标题中有多个单词用句点分隔时,正则表达式就无法获取任何内容。

我在这里做错了什么?

答案1

对于我来说,使用该示例文件名和 Perl 作为正则表达式引擎,您的模式似乎工作得很好:

$ echo '2001.A.Space.Odyssey.1968.720p.BluRay.DD5.1.x264-LiNG.mkv' | 
    perl -npe 's/^(.+).(\d{4}).+.(mp4|avi|mkv)$/\1 (\2).\3/'

2001.A.Space.Odyssey (1968).mkv

我唯一想改变的是,.当你确实想让它们表示句点而不是通配符时,将 's 转义。特别是,可以安全地假设文件扩展名前的最后一个句点实际上是一个句点 - 我不确定标题和年份之间的句点。

答案2

我花了几个小时编写和微调一个 Python 脚本来执行此操作。我发现,这通常不像处理单个文件那样黑白分明。

注意:这是基于 Python 的,如果你使用其他语言,则需要进行调整

我为什么要告诉你这个:

  • 有时文件命名不当,而父文件夹的命名却如您所指示的那样。
  • 有时你会在中间看到应该/不应该大写的冠词或罗马数字
  • 您可能希望将“The”移到末尾,如“,The”
  • 有时缺少日期
  • 在您的特定示例中,您的正则表达式将很难区分 2001 年和 1968 年。

最后,您可能会发现将您的功能分解成几个块(或使用匹配)将有助于您将其分解。

以下是我最终使用内容的基本摘要:

1:设置一些全局变量以提供灵活性:

renamePattern = "%titlethe% %quality% (%year%).%ext%" 
articles = ['a', 'an', 'of', 'the', 'is', 'on', 'at', 'in', 'and']
roman = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'XIII']

2:检查文件是否有有效的名称,否则向上检查文件夹:

if (re.search(".+(108|72)0p?.+", folder) and re.search(".+(\s|\.)(19|20)[0-9][0-9](.*|(?!p))", folder)):
#appears to have a valid quality and date, return folder

elif (re.search(".+(108|72)0p?.+", file) and re.search(".+(\s|\.)(19|20)[0-9][0-9](.*|(?!p))", file)):
#appears to have a valid date and quality, return file

else:
#return None, which will fail the script

3:施展魔法

f = re.sub("\.", " ", file_string)
s = re.sub("\.", "", s)

if re.search("\%\w+\%", s):
    if re.search("titlethe", s):
        s = titleCase(f, articles)
        s = re.sub("\s(19|20)[0-9][0-9](.*|(?!p))$", "", s)
        s = re.sub("\s?(108|72)0p\s?", "", s, re.I)
        if re.search("^The\s", s):
            s = re.sub("^The\s", "", s) + ", The"
    elif re.search("thetitle", s):
        #do thetitle stuff
        s = titleCase(f, articles)
        s = re.sub("\s(19|20)[0-9][0-9](.*|(?!p))$", "", s)
        s = re.sub("\s?(108|720)p\s?", " ", s, re.I)
    elif re.search("quality", s):
        if re.search(".*1080p?.*", f, re.I):
            s = "1080p"
        elif re.search(".*720p?.*", f, re.I):
            s = "720p"
    elif re.search("year", s):
        p = re.compile(".+\s(?P<year>(19|20)[0-9][0-9])(.*|(?!p))")
        if p is not None:
            m = p.match(f)
            s = m.group('year')
    elif re.search("ext", s):
        s = getExt(file_name)
return re.sub("[ ]{2,}", " ", s)

编辑:最后,如果您实际上只是想要我编写的 python 脚本,请告诉我,我会将其发布在 sourceforge 或 git 上。

相关内容