我用以下函数编写了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'))
输出值
Returned: 2012 — I’d like this to be 2009 (i.e. last occurrence of year in string)
Returned: 2012 — This is correct! (last occurrence of year is the first one, thus right)
Returned: 2001 — I’d like this to be 1968 (i.e. last occurrence of year in string)
问题
可以看到,正则表达式将仅针对一年的第一次出现而不是最后一年.这是有问题的,因为某些标题(例如此处包括的标题)以一年开头.
寻找了获取该年最后一次出现的方法的指南后,我开始使用诸如negative lookahead、last occurrence of repeated group和last 4 digits in URL之类的资源,这些资源都没有使我更接近于实现预期的结果.当前没有任何问题可以回答这种特殊情况.
预期结果
>我想从给定的文件名中提取一年中的最后一次出现(而不是第一年),并使用上面的输出引用中所述的现有定义/函数将其返回.
虽然我使用了在线正则表达式参考,但是我对regex还是陌生的,我会感谢有人向我展示了如何实现此过滤器以处理上述文件名.干杯们.
解决方法:
您需要更改两件事:
>第一个.*?惰性模式必须变为贪婪.*(在这种情况下,.*之后的子模式将与字符串中的最后一个匹配)
>您需要使用的组是组2,而不是组1(因为它是存储年份数据的组).或使第一个捕获组不捕获.
查看this demo:
rg = re.compile('.*([\[\(]?((?:19[0-9]|20[01])[0-9])[\]\)]?)', re.IGNORECASE|re.DOTALL)
...
releaseYear = match.group(2)
要么:
rg = re.compile('.*(?:[\[\(]?((?:19[0-9]|20[01])[0-9])[\]\)]?)', re.IGNORECASE|re.DOTALL)
...
releaseYear = match.group(1)