使用正则表达式将电影文件名与可选部分匹配

Match movie filenames with optional parts with regex

我有以下格式的片名

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

粗体部分是可选的,意思是我可以有这样的标题

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

使用这个正则表达式

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

我得到以下结果

studio = Studio Name
title  = Film Title Part-1
genre  = - Animation
year   = 2014

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

来使 "- 动画" 可选
^\((?P<studio>.+)\) - (?P<title>.+)(?:(?P<genre>-.+)?)\((?P<year>\d{4})\)

但我最终得到以下结果

studio = Studio Name
title  = Film Title Part-1 - Animation
genre  = 
year   = 2014

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

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

你可以省略流派周围的非捕获组,将第一个 .* 更改为否定字符 class [^()] 匹配除括号外的任何字符并使 .+ in group title non greedy to allow matching the optional genre group.

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

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

Regex demo

说明

  • ^ 字符串开头
  • \((?P<studio>[^()]+)\) Named group studio 匹配除 ()
  • 之间的任何字符
  • - 字面匹配
  • (?P<title>.+?) 命名组 title,尽可能匹配除换行符外的任何字符
  • (?P<genre>- \w+ )? 命名组 genre,匹配 - space,1+ 字字符和 space
  • \((?P<year>\d{4})\) 命名组 year,匹配 ()
  • 之间的 4 个数字

如果要整行匹配:

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