Python使用datefinder提取日志日期时出现多余不存在的日期如何解决
问题原因说明
datefinder返回多余日期的原因
datefinder底层会扫描字符串中所有符合数字分隔规则的片段,自动补全缺失的日期分量生成结果。你示例日志末尾的TDD:45、CVX:32被识别为年份(自动补20前缀变成2045、2032),再补默认月日,就生成了两个不存在的0点日期。
dateutil开启fuzzy=True仍报错的原因
dateutil的fuzzy=True仅支持忽略日期前后的少量无关文本,当字符串中存在大量连续数字、多组冒号分隔的数字片段时,解析器无法定位合法的日期主体,就会抛出格式识别错误。
解决方案
无需手动编写正则的前提下,有两个可行方案:
- 方案1:优化datefinder的参数和结果过滤
开启strict严格模式禁止自动补全缺失的日期分量,再过滤掉没有时分秒的错误结果即可,修改后代码如下:
import datefinder def date_using_datefinder(date_string): # 开启严格模式,缺失年/月/日任意分量的片段不会被识别为日期 matches = datefinder.find_dates(date_string, strict=True) for match in matches: # 过滤掉无时分秒的错误识别结果,匹配你日志中时间带时分秒的特征 if match.hour != 0 or match.minute !=0 or match.second !=0: print(match)
运行该代码即可过滤掉多余的2045、2032年错误结果。
- 方案2:使用dateparser库(更推荐,适配多格式日志场景)
dateparser是专门为非结构化文本中的日期提取设计的库,支持自动适配绝大多数日期写法,无需手动匹配格式,适配性更强。
首先安装依赖:
pip install dateparser
使用示例代码:
import dateparser def extract_log_date(date_string): settings = { 'DATE_ORDER': 'DMY', # 适配你日志中日/月/年的日期顺序 'RETURN_AS_TIMEZONE_AWARE': False } return dateparser.parse(date_string, settings=settings) # 测试之前dateutil报错的日志行 test_str = "[26/08/2020 06:58:29.136579][ALST][stx][29][ggg] JET_AT_JUMP:TRUX_MSGD_HTXX:13265261686865256:QWERT_DUMPING_TDD:45:DUST_RPOP_CVX:32:AXTP_DI:65576" print(extract_log_date(test_str)) # 输出:2020-08-26 06:58:29.136579
内容的提问来源于stack exchange,提问作者codex
相关产品推荐
相关产品推荐

