首页 > 解决方案 > 使用正则表达式将电影文件名与可选部分匹配

问题描述

我有以下格式的电影标题

(Studio Name) - Film Title Part-1** - Animation** (2014).mp4

BOLD 中的部分是可选的,这意味着我可以有这样的标题

(Studio Name) - Film Title Part-1 (2014).mp4

有了这个正则表达式

^\((?P<studio>.+)\) - (?P<title>.+)(?P<genre>-.+)\((?P<year>\d{4})\)

我得到以下结果

工作室 = 工作室名称
标题 = 电影标题第 1 部分
流派 = - 动画
年份 = 2014

我尝试了以下方法,通过将正则表达式更改为

^\((?P<studio>.+)\) - (?P<title>.+)(?:(?P<genre>-.+)?)\((?P<year>\d{4})\)

但我最终得到以下结果

工作室 = 工作室名称
标题 = 电影标题第 1 部分 - 动画
流派 =
年份 = 2014

我正在使用 Python,我正在执行来处理正则表达式的代码是

pattern = re.compile(REGEX) 
matched = pattern.search(film)

标签: regexpython-2.7regex-group

解决方案


您可以省略流派周围的非捕获组,将第一个更改为匹配除括号之外的任何字符.*的否定字符类,并使组中标题非贪婪以允许匹配可选的流派组。[^()].+

对于流派,您可以 match .+,或者如果您只想匹配一个单词,则使匹配更具体。

^\((?P<studio>[^()]+)\) - (?P<title>.+?)(?P<genre>- \w+ )?\((?P<year>\d{4})\)

正则表达式演示

解释

  • ^字符串的开始
  • \((?P<studio>[^()]+)\)命名组工作室匹配任何字符,除了和之间(的括号)
  • - 从字面上匹配
  • (?P<title>.+?)命名组标题,尽可能匹配除换行符以外的任何字符
  • (?P<genre>- \w+ )?命名组流派、匹配-空间、1+ 单词字符和空格
  • \((?P<year>\d{4})\)命名组,匹配和之间的 4 位(数字)

如果要匹配整行:

^\((?P<studio>[^()]+)\) - (?P<title>.+?)(?P<genre>- \w+ )?\((?P<year>\d{4})\)\.mp4$

推荐阅读