Python Regex:返回包含年份范围的字符串的最大数目

Python Regex:返回包含年份范围的字符串的最大数目,python,regex,algorithm,performance,Python,Regex,Algorithm,Performance,我有以下三个包含存储为字符串的年份的范围: year1 = '2006-07' year2 = '2006-2007' year3 = '2020/21' 我想创建一个返回较高年份的函数。对于上述变量,结果如下: year1 -> 2007 year2 -> 2007 year3 -> 2021 解决此问题的最有效方法是什么?您可以生成范围并使用max: import re def max_year(d): vals = re.split('[\/\-]', d)

我有以下三个包含存储为字符串的年份的范围:

year1 = '2006-07'
year2 = '2006-2007'
year3 = '2020/21'
我想创建一个返回较高年份的函数。对于上述变量,结果如下:

year1 -> 2007
year2 -> 2007
year3 -> 2021

解决此问题的最有效方法是什么?

您可以生成范围并使用
max

import re
def max_year(d):
   vals = re.split('[\/\-]', d)
   x, y = [i for i in vals if len(i) == 4], [i for i in vals if len(i) != 4]
   return max(map(int, x+[x[0][:2]+i for i in y]))

year1 = '2006-07'
year2 = '2006-2007'
year3 = '2020/21'
print(max_year(year1))
print(max_year(year2))
print(max_year(year3))
输出:

2007
2007
2021

取决于您预期的模式

(\d{4})

应该有用。将匹配的组进行排序


这是一个测试表达式的好网站:

您可以利用python中内置的日期解析。唯一的诀窍是决定是使用
“%Y”
格式还是
“%Y”
格式,这取决于您是通过两位数年份还是四位数年份。您可以使用
re.findall()
从字符串中提取数字,这比这里的split稍微简单,并且具有使用多个分隔符的优点:

import re
from datetime import datetime

def maxYear(y):
    toFormat = lambda s: "%y" if len(s) == 2 else "%Y"
    years = re.findall(r'\d+', y)
    return max(datetime.strptime(s, toFormat(s)) for s in years).year


maxYear('2006-07')
# 2007
maxYear('2006-2007')
# 2007
maxYear('2020/21')
# 2021

# Edge cases:
maxYear("1999/00")
# 2000

maxYear("1967/68")
# 2068 <- datetime century cuttoff is 1968

maxYear("1967/69")
# 1969

# it's flexible
maxYear('2021:2000:2022:1968:10')
# 2022 
重新导入
从日期时间导入日期时间
def最大年份(y):
toFormat=lambda s:“%y”如果len=2,则为“%y”
年份=re.findall(r'\d+',y)
返回s的最大值(以年为单位的datetime.strtime,toFormat)。年
maxYear(2006-07年度)
# 2007
maxYear(2006-2007年)
# 2007
最大年份('2020/21')
# 2021
#边缘情况:
maxYear(“1999/00”)
# 2000
maxYear(“1967/68”)

#2068年,如“1999-01年”
是有问题的,对这类日期的假设是导致错误的常见原因。
import re
from datetime import datetime

def maxYear(y):
    toFormat = lambda s: "%y" if len(s) == 2 else "%Y"
    years = re.findall(r'\d+', y)
    return max(datetime.strptime(s, toFormat(s)) for s in years).year


maxYear('2006-07')
# 2007
maxYear('2006-2007')
# 2007
maxYear('2020/21')
# 2021

# Edge cases:
maxYear("1999/00")
# 2000

maxYear("1967/68")
# 2068 <- datetime century cuttoff is 1968

maxYear("1967/69")
# 1969

# it's flexible
maxYear('2021:2000:2022:1968:10')
# 2022