如何高效筛选列表中含2018年后年份或无年份的字符串?
字符串列表按年份高效筛选方案
需求说明
我有一个字符串列表,需要按规则筛选:保留不含年份的字符串,以及包含2018年之后年份的字符串。现有实现可完成功能,但想寻求更高效的解法。
数据示例
data = [ '/soccer/zimbabwe/premier-soccer-league/results/', '/soccer/zimbabwe/premier-soccer-league-2020/results/', '/soccer/zimbabwe/premier-soccer-league-2019/results/', '/soccer/zimbabwe/premier-soccer-league-2018/results/', '/soccer/zimbabwe/premier-soccer-league-2017/results/' ]
现有脚本
import re for i in data: match = re.match(r".*([1-3][0-9]{3})",i) if match is not None: if match.group(1) > '2018': print(i) else: print(i)
高效优化方案
现有脚本存在匹配范围过宽、未复用正则编译、仅打印结果不保存等问题,以下是更高效的实现:
import re # 预编译正则,批量匹配时提升效率 year_pattern = re.compile(r'-(\d{4})/') filtered_data = [ s for s in data # 海象运算符简化逻辑:无年份匹配 或 年份大于2018 if (match := year_pattern.search(s)) is None or int(match.group(1)) > 2018 ] print(filtered_data)
优化点说明
- 预编译正则:提前用
re.compile编译规则,避免每次匹配重复解析正则,批量处理时效率提升明显。 - 精准匹配规则:正则
-(\d{4})/专门匹配路径中-年份/格式的四位数字,避免误匹配字符串中其他位置的无关数字。 - 列表推导式:相比显式for循环,列表推导式是Python底层优化的语法,执行速度更快,且直接生成结果列表便于后续使用。
- 整数比较:将匹配到的年份转为整数再比较,比字符串比较更严谨,逻辑更符合数值判断的直觉。
正确预期输出
按照需求,筛选后的结果应为:
[ '/soccer/zimbabwe/premier-soccer-league/results/', '/soccer/zimbabwe/premier-soccer-league-2020/results/', '/soccer/zimbabwe/premier-soccer-league-2019/results/' ]
内容的提问来源于stack exchange,提问作者benjamin olise
相关产品推荐
相关产品推荐

