本文介绍如何从文本文件中提取四位数年份(如2018、2020),将其与所在行一并存储,按年份数值升序排序,并格式化输出“found yyyy : 原始行内容”。
本文介绍如何从文本文件中提取四位数年份(如2018、2020),将其与所在行一并存储,按年份数值升序排序,并格式化输出“found yyyy : 原始行内容”。
要实现“按年份升序排序并打印对应完整行”,关键在于同时捕获匹配年份和其所在的原始行,而非仅输出年份数字。原代码仅逐行提取并打印年份,丢失了上下文信息;改进方案需构建 (年份整数, 原始行) 的元组列表,再基于年份排序。
以下是完整、健壮的实现代码:
import os
import re
file = 'wine.txt'
if os.path.isfile(file):
lines_with_dates = [] # 存储 (年份int, 去首尾空格的行str) 元组
with open(file, 'r', encoding='utf-8') as f:
for line in f:
# 使用 \b 确保匹配独立的4位数字(避免匹配 20234 中的 2023)
match = re.search(r'\b\d{4}\b', line)
if match:
year = int(match.group())
# 保留原始行语义完整性:strip() 去除换行符和两端空格,但保留内部格式
cleaned_line = line.strip()
lines_with_dates.append((year, cleaned_line))
# 按年份升序排序(默认升序,key指定排序依据为元组第一个元素)
lines_with_dates.sort(key=lambda x: x[0])
# 格式化输出
for year, line in lines_with_dates:
print(f"Found {year} : {line}")
else:
print("File does not exist")
✅ 关键优化说明:
- 精准匹配:正则 r'\b\d{4}\b' 中的 \b(单词边界)防止误匹配如 12018 或 20234 中的子串;
- 类型安全:将年份转为 int 后排序,确保 2020 "2019" 但 "2020" "1000" 会出错);
- 行完整性:使用 line.strip() 保留行内所有字符(含标点、空格),仅清除换行符与首尾冗余空白;
- 可扩展性:若需去重、过滤范围(如仅 1900–2100)、或支持多日期行,可在 append 前添加逻辑判断。
⚠️ 注意事项:
- 若某行含多个四年份(如 "Best vintages: 1998, 2005, 2012"),当前代码仅捕获第一个;如需全部匹配,应改用 re.findall() 并循环处理;
- 文件编码建议显式指定(如 encoding='utf-8'),避免中文或特殊字符报错;
- 大文件场景下,此方案内存友好(单次遍历 + 列表存储),无需加载全文到内存。
该方法兼顾准确性、可读性与工程实用性,是文本中结构化时间信息提取与排序的标准实践。











