regex - 使用正则表达式将电影文件名与可选部分匹配
问题描述
我有以下格式的电影标题
(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)
解决方案
您可以省略流派周围的非捕获组,将第一个更改为匹配除括号之外的任何字符.*
的否定字符类,并使组中标题非贪婪以允许匹配可选的流派组。[^()]
.+
对于流派,您可以 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$
推荐阅读
- actionscript-3 - 无法从正常大小切换视频
- python - 重定向时 /upload/ 处的 NoReverseMatch
- c - C - 调用函数并给出二维数组
- c - 如何在 C 中的字符串内设置变量占位符
- c++ - 模板 ID 不匹配任何模板声明
- visual-studio - DEVENV 命令行构建失败:“此操作可能只发生在 UI 线程中”
- mysql - 检查数据库中的记录是否存在于 csv 文件中
- wordpress - WooCommerce 获取所有运输方式计算 API
- javascript - 保持与 react.js 相同的 socket.id
- postgresql - 检查值是否不等于选择查询时触发函数总是引发异常