python-正则表达式匹配字符串中年份的最后一次出现

我用以下函数编写了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 lookaheadlast occurrence of repeated grouplast 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)
上一篇:当文件名较长时,Python的os.walk()在Windows中失败


下一篇:使用SAX解析XML