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