python - 正则表达式:返回包含年份范围的最大字符串数
问题描述
我有以下三个范围,其中包含存储为字符串的年份:
year1 = '2006-07'
year2 = '2006-2007'
year3 = '2020/21'
我想创建一个返回较高年份的函数。对于上述变量,结果如下:
year1 -> 2007
year2 -> 2007
year3 -> 2021
解决这个问题的最有效方法是什么?
解决方案
您可以利用 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
推荐阅读
- leaflet - Displaying styles stored in a GeoJson File and making lines appear as lines instead of markers
- ansible - 避免在 Ansible Tower 或 AWX 中为工作流制作大量模板
- java - Android:尝试在空对象引用上调用虚拟方法“void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)”
- angular - 以角度隐藏浏览器url中的查询参数
- git - GIT 存储和分支之间切换问题 - 来自一个分支的工作出现在另一个分支上而没有合并
- database - Mongoose 获取从一个集合到另一个集合的关系大小
- erlang - Erlang的split_binary函数的实现
- swiftui - How we can read @State variable from other struct in SwiftUI?
- javascript - Vue plugin component with own CSS (style is extracted but not applied)
- c# - INSERT more than 1000 rows into SQL Server database from JSON in C# code