如何从文件名中提取电影名称

Rik*_*ggi 6 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']
Run Code Online (Sandbox Code Playgroud)

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

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

metadata = {'title': 'The Movie Title', 'year': '2005'}
Run Code Online (Sandbox Code Playgroud)

现在我正在使用一串 regexp,但我不知道有更好的方法来做到这一点。

Lbr*_*BoC 9

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

安装它: 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)
Run Code Online (Sandbox Code Playgroud)

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

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


Grz*_*cki 2

正如您在评论之一中提到的,将“文件名处理”转换为“标准化移动标题形式”的目的是比较两个列表。

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

首先,您需要仔细考虑您接受什么样的变化。您提到了“movie”“the”的不同位置 - 拼写错误和区分大小写怎么样?词序呢?

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

我想到了一些想法——拿你喜欢的东西,随意混合,稍微加热一下,它就会煮得很好——我们开始吧:

  • LCS:最长公共子串问题最长公共子序列问题- 在以下情况下有用:
    • 单词的顺序很重要。
    • 通用,只需设置子字符串/子序列的大小作为输入的百分比(最大或最小或平均值或两个文件名的总和 - 您的选择)
  • 匹配的不是字符串,而是单词集。因此,你可以抵制单词顺序、重复等。当你用 python 编写时,你可以很容易地创建单词集的集合,或者单词集的映射。这里有一些提示:
    • 对于每部电影 - 而不是对整个字符串进行正则表达式:(1)将电影文件名拆分为单词(2)消除:“the”,“movie”等(3)剪掉最重要的部分(“walking”-“ing” ” -> “步行”等)。(4) 将左边的单词放入集合中 (5) 结果集被设置为代表电影。
    • 对于每个列表:所有电影的文件名都转换为集合(如上所述),并将所有这些集合放入集合中(现在您有一组字符串集合 - 是的)
    • 对于列表 A 和 B :只需执行A ^ BA - B,再次 - 您需要什么(查看Python手册:Sets .
  • 如果您稍后需要将表示电影的集恢复为电影文件名。在创建列表 A、B 期间,您需要创建映射 MA、MB,它们将为您将“单词集”映射到“文件名”。
  • 又是LCS,但现在想象一下你的字母表是单词。如果您不熟悉正式语言术语- 想象一下您的电影名称是用特殊字母写的,每个字母恰好是一个单词。感谢您拥有单词序列,并且您可以搜索单词的子序列。现在应用LCS将为您提供电影标题中的“保留顺序的最长公共单词集”