Python datefinder仅年份场景下日期提取失效的解决方案咨询
解决仅年份场景下的日期识别问题
datefinder库对包含月份、日的日期识别效果不错,但默认不会将单独的4位数字或年份范围识别为日期。要同时兼容各类完整/不完整日期格式,可通过正则预处理纯年份+datefinder处理其他格式的组合方案实现需求。
实现思路
- 用正则提前捕获输入中的单个纯年份(4位数字)和年份范围(如
2014 - 2018),手动补全为当年1月1日的日期对象 - 调用datefinder处理带月份、日的日期格式,确保兼容性
- 对识别到的日期去重、排序,最后格式化为
YYYY/MM/DD的字符串
完整代码示例
import re import datefinder from datetime import datetime def extract_and_format_dates(input_str): dates = [] # 匹配单个4位年份或年份范围(支持空格分隔的连字符) year_pattern = re.compile(r'\b(\d{4})\s*-\s*(\d{4})\b|\b(\d{4})\b') year_matches = year_pattern.findall(input_str) for match in year_matches: # 处理年份范围 if match[0] and match[1]: start_year = int(match[0]) end_year = int(match[1]) dates.append(datetime(start_year, 1, 1)) dates.append(datetime(end_year, 1, 1)) # 处理单个年份 elif match[2]: year = int(match[2]) # 可添加年份范围校验,比如只处理1900-2100之间的年份 if 1900 <= year <= 2100: dates.append(datetime(year, 1, 1)) # 用datefinder识别带月份/日的日期 for df_date in datefinder.find_dates(input_str): dates.append(df_date) # 去重(避免重复识别同一日期,比如带月份的年份会被正则和datefinder同时捕获) unique_dates = list({dt.date(): dt for dt in dates}.values()) # 按时间排序 unique_dates.sort() # 格式化为目标字符串 return [dt.strftime('%Y/%m/%d') for dt in unique_dates] # 测试各类场景 test_inputs = [ '2014 - 2018', '2014', 'May 2014', '08/2014', '03/10/2018', '01 March 2013' ] for input_str in test_inputs: print(f"输入: {input_str}") print("输出:") print('\n'.join(extract_and_format_dates(input_str))) print('---')
关键说明
- 正则匹配规则可根据需求调整,比如支持中文连字符(
—)或更严格的年份边界校验 - 若需过滤不合理年份(如1000或3000),可在添加日期对象前加入年份范围判断
- datefinder会自动识别多种日期格式(如
MM/YYYY、DD Month YYYY等),无需额外处理 - 去重步骤保留更精确的日期(比如
May 2014会保留2014/05/01而非2014/01/01)
内容的提问来源于stack exchange,提问作者Dino
相关产品推荐
相关产品推荐

