有时在处理不规则数据时需要提取文本包含的时间日期。
dateutil.parser模块可以统一日期字符串格式。
datefinder模块可以在字符串中提取日期。
datefinder模块实现也是用正则,功能很全 但是对中文不友好。
但是这两个模块都不能支持中文及一些特殊的情况;所以我用正则写了段代码可进行中文日期及一些特殊的时间识别
例如:
'2012年12月12日','3小时前','在2012/12/13哈哈','时间2012-12-11 12:22:30','日期2012-13-11','测试2013.12.24','今天12:13'
import re import chardet from datetime import datetime,timedelta # 匹配正则表达式 matchs = { 1:(r'\d{4}%s\d{1,2}%s\d{1,2}%s \d{1,2}%s\d{1,2}%s\d{1,2}%s','%%Y%s%%m%s%%d%s %%H%s%%M%s%%S%s'), 2:(r'\d{4}%s\d{1,2}%s\d{1,2}%s \d{1,2}%s\d{1,2}%s','%%Y%s%%m%s%%d%s %%H%s%%M%s'), 3:(r'\d{4}%s\d{1,2}%s\d{1,2}%s','%%Y%s%%m%s%%d%s'), 4:(r'\d{2}%s\d{1,2}%s\d{1,2}%s','%%y%s%%m%s%%d%s'), # 没有年份 5:(r'\d{1,2}%s\d{1,2}%s \d{1,2}%s\d{1,2}%s\d{1,2}%s','%%m%s%%d%s %%H%s%%M%s%%S%s'), 6:(r'\d{1,2}%s\d{1,2}%s \d{1,2}%s\d{1,2}%s','%%m%s%%d%s %%H%s%%M%s'), 7:(r'\d{1,2}%s\d{1,2}%s','%%m%s%%d%s'), # 没有年月日 8:(r'\d{1,2}%s\d{1,2}%s\d{1,2}%s','%%H%s%%M%s%%S%s'), 9:(r'\d{1,2}%s\d{1,2}%s','%%H%s%%M%s'), } # 正则中的%s分割 splits = [ {1:[('年','月','日','点','分','秒'),('-','-','',':',':',''),('\/','\/','',':',':',''),('\.','\.','',':',':','')]}, {2:[('年','月','日','点','分'),('-','-','',':',''),('\/','\/','',':',''),('\.','\.','',':','')]}, {3:[('年','月','日'),('-','-',''),('\/','\/',''),('\.','\.','')]}, {4:[('年','月','日'),('-','-',''),('\/','\/',''),('\.','\.','')]}, {5:[('月','日','点','分','秒'),('-','',':',':',''),('\/','',':',':',''),('\.','',':',':','')]}, {6:[('月','日','点','分'),('-','',':',''),('\/','',':',''),('\.','',':','')]}, {7:[('月','日'),('-',''),('\/',''),('\.','')]}, {8:[('点','分','秒'),(':',':','')]}, {9:[('点','分'),(':','')]}, ] def func(parten,tp): re.search(parten,parten) parten_other = '\d+天前|\d+分钟前|\d+小时前|\d+秒前' class TimeFinder(object): def __init__(self,base_date=None): self.base_date = base_date self.match_item = [] self.init_args() self.init_match_item() def init_args(self): # 格式化基础时间 if not self.base_date: self.base_date = datetime.now() if self.base_date and not isinstance(self.base_date,datetime): try: self.base_date = datetime.strptime(self.base_date,'%Y-%m-%d %H:%M:%S') except Exception as e: raise 'type of base_date must be str of%Y-%m-%d %H:%M:%S or datetime' def init_match_item(self): # 构建穷举正则匹配公式 及提取的字符串转datetime格式映射 for item in splits: for num,value in item.items(): match = matchs[num] for sp in value: tmp = [] for m in match: tmp.append(m%sp) self.match_item.append(tuple(tmp)) def get_time_other(self,text): m = re.search('\d+',text) if not m: return None num = int(m.group()) if '天' in text: return self.base_date - timedelta(days=num) elif '小时' in text: return self.base_date - timedelta(hours=num) elif '分钟' in text: return self.base_date - timedelta(minutes=num) elif '秒' in text: return self.base_date - timedelta(seconds=num) return None def find_time(self,text): # 格式化text为str类型 if isinstance(text,bytes): encoding =chardet.detect(text)['encoding'] text = text.decode(encoding) res = [] parten = '|'.join([x[0] for x in self.match_item]) parten = parten+ '|' +parten_other match_list = re.findall(parten,text) if not match_list: return None for match in match_list: for item in self.match_item: try: date = datetime.strptime(match,item[1].replace('\\','')) if date.year==1900: date = date.replace(year=self.base_date.year) if date.month==1: date = date.replace(month=self.base_date.month) if date.day==1: date = date.replace(day=self.base_date.day) res.append(datetime.strftime(date,'%Y-%m-%d %H:%M:%S')) break except Exception as e: date = self.get_time_other(match) if date: res.append(datetime.strftime(date,'%Y-%m-%d %H:%M:%S')) break if not res: return None return res def test(): timefinder =TimeFinder(base_date='2020-04-23 00:00:00') for text in ['2012年12月12日','3小时前','在2012/12/13哈哈','时间2012-12-11 12:22:30','日期2012-13-11','测试2013.12.24','今天12:13']: res = timefinder.find_time(text) print('text----',text) print('res---',res) if __name__ == '__main__': test()
测试运行结果如下
text---- 2012年12月12日
res--- ['2012-12-12 00:00:00']
text---- 3小时前
res--- ['2020-04-22 21:00:00']
text---- 在2012/12/13哈哈
res--- ['2012-12-13 00:00:00']
text---- 时间2012-12-11 12:22:30
res--- ['2012-12-11 12:22:30']
text---- 日期2012-13-11
res--- None
text---- 测试2013.12.24
res--- ['2013-12-24 00:00:00']
text---- 今天12:13
res--- ['2020-04-23 12:13:00']
到此这篇关于python自动提取文本中的时间(包含中文日期)的文章就介绍到这了,更多相关python自动提取时间内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
更新日志
2024年11月15日
2024年11月15日
- s13wbg战队成员都有谁 wbg战队s13成员名单一览
- 网友热议《幻兽帕鲁》停售、赔千万日元:那也赚麻了 不亏
- 这谁顶得住 《最终幻想7:重生》尤菲3D作品穿上终极芙蕾娜衣服
- 外媒称PS5pro违背承诺:《蜘蛛侠2》根本没法4K60帧
- 群星.2007-中文十大金曲30周年纪念专辑【RTHK】【WAV+CUE】
- 杨林.1989-留一点爱来爱自己【综一唱片】【WAV+CUE】
- 南合文斗.2007-陪君醉笑三千尘鸟人唱片】【FLAC+CUE】
- 群星《我们的歌第六季 第1期》[320K/MP3][90.72MB]
- 群星《我们的歌第六季 第1期》[FLAC/分轨][456.01MB]
- 李雨寰《Break Free》[320K/MP3][98.39MB]
- 草蜢.2001-《真经典》环球唱片[WAV+CUE]
- 群星.2009-第4届2008十大发烧唱片精选[FLAC+CUE]
- 丁红《女儿情》[DTS-WAV]
- 陈惠婷.2017-Voyager3【亚神音乐】【FLAC分轨】
- 群星.2001-华纳歌声魅影【华纳】【WAV+CUE】