如何从文件名中提取电影标题

时间:2012-01-18 20:54:36

标签: python regex

我正在尝试从文件名中提取电影元数据(标题和年份)。

名称模式不是标准的,但它也不是随机的,所以我试图尽可能多地覆盖案例。
为了给你一个想法,这是文件名的例子:

samples = ['The Movie Title.avi',
           'The Movie Title DVDRIP. Useless.info.avi',
           'The Movie Title [2005].avi',
           'The Movie Title (2005) [Useless.info].avi',
           'The Movie Title 2005 H264 DVDRip Useless-Info.avi',
           'The Movie Title 2005 XviD Useless info.avi',
           'The Movie Title {2005} DVDRIP. UselessInfo.avi',
           'The.Movie.Title.2005.Useless.info.avi',
           '[Useless.info]_The.Movie.Title.2005.Useless.avi']

任何地方都有UselessInfo,因为写入的内容可能是任何内容,不能用于获取信息(从文件到文件的更改)。另请注意,'The Movie Title'可能是带数字或非字母字符的字符,例如:The Movie Title 2 - The Return'

预期输出应该是一个字典,如:

metadata = {'title': 'The Movie Title', 'year': '2005'}

现在我正在使用正则表达式链,但我不知道有更好的方法可以做到这一点。

3 个答案:

答案 0 :(得分:2)

为什么不下载一个包含电影名称和日期列表的数据库(可能在维基百科上),然后将文件名与此列表进行比较?有太多边缘情况可能更有效。

答案 1 :(得分:2)

很久以前!但如果有人需要它,我发现这个名为PTN的python library非常有用!非常感谢那个编码它的人!

安装它:pip install parse-torrent-name

import PTN

torrentName = "[Torrent9.info ] Silicon.Valley.S04E04.VOSTFR.WEB-DL.XviD-T9.avi"

info = PTN.parse(torrentName)

print(info)

输出:{'episode': 4, 'codec': 'XviD', 'title': 'Silicon.Valley.', 'group': 'T9', 'website': 'Torrent9.info', 'excess': 'VOSTFR', 'season': 4, 'quality': 'WEB-DL'}

所以它似乎正是你所需要的!

答案 2 :(得分:1)

正如你在其中一篇评论中提到的,这个“文件名处理”到“标准化移动标题表”的目的是比较两个列表。

使用您当前的方法,您可能会错过许多极端情况。

首先,您需要仔细考虑接受哪种变体。你已经提到了“电影”“the”的不同地方 - 那么拼写错误和区分大小写? 单词顺序怎么样?

我建议您寻找一种通用的解决方案,而不是让您的代码越来越长。

我想到了一些想法 - 拿你喜欢的东西,随意混合,加热一点,它就会煮得很好 - 我们走了:

  • LCS:Longest common substring problemLongest common subsequence problem - 在以下情况下非常有用:
    • 单词的顺序很重要。
    • 通用,只需将子串/子序列的大小设置为输入的百分比(最大值或最小值或平均值或两个文件名的总和 - 您的选择)
  • 匹配不是字符串,而是匹配单词。多亏了这一点,你可以抵抗言语,重复和其他的顺序。当您在python中编写时,您可以轻松地创建一组单词或一组单词的映射。这里有一些提示:
    • 对于每部电影 - 而不是正则表达整个字符串:(1)将电影文件名拆分为单词(2)消除:“the”,“movie”等(3)剪掉最重要的部分(“走路”) - “ing” - >“walk”等)。 (4)将单词放入set(5)中设置结果集,即表示电影。
    • 对于每个列表:所有电影的文件名都转换为集合(如上所述),所有这些集合都放入集合中(现在你有一组字符串集 - 是的)
    • 对于列表A和B:再次执行A ^ BA - B - 您需要的内容(结帐Python Manual: Sets
  • 如果稍后需要将设置代表影片恢复为影片文件名。在创建列表A,B期间,您需要创建地图MA,MB,它将为您将“单词集”映射为“文件名”。
  • 再次LCS ,但现在想象你的字母是单词。如果您不熟悉Formal langages terminology - 想象您的电影名称是用特殊字母书写的,那么每个字母都只是一个字。多亏了你有一系列单词,你可以搜索单词的后续序列。现在应用LCS将在电影标题中为您提供“保存顺序最长的单词集。”