【问题标题】:Match movie filenames with optional parts with regex使用正则表达式将电影文件名与可选部分匹配
【发布时间】:2020-06-10 15:15:28
【问题描述】:

我有一个格式如下的电影片名

(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})\)

我得到以下结果

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

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

,使 "- Animation" 成为可选
^\((?P<studio>.+)\) - (?P<title>.+)(?:(?P<genre>-.+)?)\((?P<year>\d{4})\)

但我最终得到以下结果

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

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

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

【问题讨论】:

  • 你的意思是这样吗? ^\((?P&lt;studio&gt;[^()]+)\) - (?P&lt;title&gt;.+?)(?P&lt;genre&gt;- \w+ )?\((?P&lt;year&gt;\d{4})\)regex101.com/r/odRLPC/1

标签: regex python-2.7 regex-group


【解决方案1】:

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

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

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

Regex demo

说明

  • ^ 字符串开始
  • \((?P&lt;studio&gt;[^()]+)\) 命名组工作室匹配除 () 之间的括号之外的任何字符
  • - 字面匹配
  • (?P&lt;title&gt;.+?) 命名组title,尽量匹配除换行符以外的任何字符
  • (?P&lt;genre&gt;- \w+ )?命名组流派,匹配-空格,1+字字符和空格
  • \((?P&lt;year&gt;\d{4})\) 命名组年份,匹配() 之间的4 位数字

如果要匹配整行:

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

【讨论】:

  • 效果很好,但完全符合我的初始代码^\((?P&lt;studio&gt;.+)\) - (?P&lt;title&gt;.+)(?P&lt;genre&gt;-.+)\((?P&lt;year&gt;\d{4})\),但我喜欢 w+ - 。
  • 我仍然不完全理解这部分^\((?P&lt;studio&gt;[^()]+)\) ,如果一个人可以用括号匹配所有内容 - 是否可以编写一个正则表达式,简单地选择两个括号之间的所有内容,包括括号本身......从而避免转义括号?
  • 这部分[^()]+ 匹配除() 之外的任何字符以防止回溯。如果您还想匹配括号,则可以改为非贪婪。 ^\((?P&lt;studio&gt;.*?)\) - (?P&lt;title&gt;.+?)(?P&lt;genre&gt;- \w+ )?\((?P&lt;year&gt;\d{4})\)regex101.com/r/IJyUTQ/1
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 2015-04-12
  • 1970-01-01
  • 2012-06-05
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多