Datefinder.find_dates将任意数字识别为日期,strict=True参数不生效问题
解决datefinder误匹配数字、strict模式无结果的方案
- 方案1:根据业务场景过滤年份范围
你处理的是2020年爆发的新冠疫情相关文本,合法日期的年份必然在2020年及之后,直接筛掉不符合年份范围的结果即可,90%以上的误匹配都可以通过这个规则清除。 - 方案2:过滤匹配到的原始字符串特征
误匹配的结果对应的原始源字符串都是短数字(如98、14),合法的日期字符串必然包含月份缩写、/或-分隔符等特征,或者长度≥6位,可通过判断源字符串的格式过滤无效结果。 - 方案3:替换匹配工具或自定义正则
如果上述规则仍无法满足需求,可以换用dateparser库调整识别精度,或直接编写正则匹配你场景下常见的英文日期格式(如月份缩写+年月日、斜杠分隔的数字日期)。
修改后的示例代码
import datefinder # 业务场景合法日期范围:2020年1月1日之后 MIN_VALID_YEAR = 2020 with open("c:/users/Lnitz/documents/ige2.txt", encoding='utf-8') as file: for line in file: matches = datefinder.find_dates(line, source=True) for match in matches: date_obj, source_str = match # 过滤规则1:年份符合范围 if date_obj.year < MIN_VALID_YEAR: continue # 过滤规则2:源字符串满足日期格式特征 if len(source_str) < 6 and not any(c in source_str for c in ['/', '-', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']): continue # 输出符合要求的结果 print(match, 'xxx', line)
效果说明
上述代码会自动过滤掉1998、1878、1945这类不符合年份范围的结果,也会跳过单个数字的误匹配,保留Nov 19, 2020这类合法日期。如果需要更严格的匹配,可以调整过滤规则的阈值,不需要开启strict=True就能获得精准结果。
内容的提问来源于stack exchange,提问作者Lawrence Nitz
相关产品推荐
相关产品推荐

