我已经编写了一个Python脚本,其中包含以下函数,该函数以包含多个日期的文件名作为输入。
代码
import re
from datetime import datetime
def ExtractReleaseYear(title):
rg = re.compile('.*?([\[\(]?((?:19[0-9]|20[01])[0-9])[\]\)]?)', re.IGNORECASE|re.DOTALL)
match = rg.search(title) # Using non-greedy match on filler
if match:
releaseYear = match.group(1)
try:
if int(releaseYear) >= 1900 and int(releaseYear) <= int(datetime.now().year) and int(releaseYear) <= 2099: # Film between 1900-2099
return releaseYear
except ValueError:
print("ERROR: The film year in the file name could not be converted to an integer for comparison.")
return ""
print(ExtractReleaseYear('2012.(2009).3D.1080p.BRRip.SBS.x264'))
print(ExtractReleaseYear('Into.The.Storm.2012.1080p.WEB-DL.AAC2.0.H264'))
print(ExtractReleaseYear('2001.A.Space.Odyssey.1968.1080p.WEB-DL.AAC2.0.H264'))
输出
返回结果:2012 -- 我希望这个结果是2009(即字符串中最后一次出现的年份)
返回结果:2012 -- 这个结果是正确的!(最后一次出现的年份是第一个,因此正确)
返回结果:2001 -- 我希望这个结果是1968(即字符串中最后一次出现的年份)
问题
可以看到,正则表达式只会匹配年份的第一次出现,而不是最后一次。这是有问题的,因为有些标题(比如这里包含的标题)以年份开头。
我已经搜索了获取最后一次出现的年份的方法,比如负向先行断言、重复组的最后一次出现和URL中的最后4位数字,但这些方法都没有让我更接近实现所需的结果。目前还没有现成的问题回答这个独特的情况。
预期结果
- 我想要从给定的文件名中提取年份的最后一次出现,并使用上述输出引用中的现有定义/函数返回它。虽然我已经使用了在线正则表达式参考资料,但我对正则表达式还很陌生,希望有人能向我展示如何实现这个过滤器来处理上面的文件名。谢谢大家。
1888
。 假设标题“2018.3D.1080p.BRRip.SBS.x264.AAC”通过函数运行,它返回2018
(注意电影标题包含年份,文件名中缺少发行年)。 在这种情况下,最后一次出现也是第一次出现。 如果最后一次出现是某种上传/记录日期,例如“2018.3D.1080p.BRRip.SBS.x264.AAC.01-01-2018”,那么确实会引起关注,我希望找到智能过滤此类情况的方法。 现在,我确信这是电影标题中罕见的格式。 - ProGrammer