python自动提取文本中的时间(包含中文日期)
有时在处理不规则数据时需要提取文本包含的时间日期。
dateutil.parser模块可以统一日期字符串格式。
datefinder模块可以在字符串中提取日期。
datefinder模块实现也是用正则,功能很全但是对中文不友好。
但是这两个模块都不能支持中文及一些特殊的情况;所以我用正则写了段代码可进行中文日期及一些特殊的时间识别
例如:
'2012年12月12日','3小时前','在2012/12/13哈哈','时间2012-12-1112:22:30','日期2012-13-11','测试2013.12.24','今天12:13'
importre importchardet fromdatetimeimportdatetime,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:[('点','分'),(':','')]}, ] deffunc(parten,tp): re.search(parten,parten) parten_other='\d+天前|\d+分钟前|\d+小时前|\d+秒前' classTimeFinder(object): def__init__(self,base_date=None): self.base_date=base_date self.match_item=[] self.init_args() self.init_match_item() definit_args(self): #格式化基础时间 ifnotself.base_date: self.base_date=datetime.now() ifself.base_dateandnotisinstance(self.base_date,datetime): try: self.base_date=datetime.strptime(self.base_date,'%Y-%m-%d%H:%M:%S') exceptExceptionase: raise'typeofbase_datemustbestrof%Y-%m-%d%H:%M:%Sordatetime' definit_match_item(self): #构建穷举正则匹配公式及提取的字符串转datetime格式映射 foriteminsplits: fornum,valueinitem.items(): match=matchs[num] forspinvalue: tmp=[] forminmatch: tmp.append(m%sp) self.match_item.append(tuple(tmp)) defget_time_other(self,text): m=re.search('\d+',text) ifnotm: returnNone num=int(m.group()) if'天'intext: returnself.base_date-timedelta(days=num) elif'小时'intext: returnself.base_date-timedelta(hours=num) elif'分钟'intext: returnself.base_date-timedelta(minutes=num) elif'秒'intext: returnself.base_date-timedelta(seconds=num) returnNone deffind_time(self,text): #格式化text为str类型 ifisinstance(text,bytes): encoding=chardet.detect(text)['encoding'] text=text.decode(encoding) res=[] parten='|'.join([x[0]forxinself.match_item]) parten=parten+'|'+parten_other match_list=re.findall(parten,text) ifnotmatch_list: returnNone formatchinmatch_list: foriteminself.match_item: try: date=datetime.strptime(match,item[1].replace('\\','')) ifdate.year==1900: date=date.replace(year=self.base_date.year) ifdate.month==1: date=date.replace(month=self.base_date.month) ifdate.day==1: date=date.replace(day=self.base_date.day) res.append(datetime.strftime(date,'%Y-%m-%d%H:%M:%S')) break exceptExceptionase: date=self.get_time_other(match) ifdate: res.append(datetime.strftime(date,'%Y-%m-%d%H:%M:%S')) break ifnotres: returnNone returnres deftest(): timefinder=TimeFinder(base_date='2020-04-2300:00:00') fortextin['2012年12月12日','3小时前','在2012/12/13哈哈','时间2012-12-1112: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-1200:00:00']
text----3小时前
res---['2020-04-2221:00:00']
text----在2012/12/13哈哈
res---['2012-12-1300:00:00']
text----时间2012-12-1112:22:30
res---['2012-12-1112:22:30']
text----日期2012-13-11
res---None
text----测试2013.12.24
res---['2013-12-2400:00:00']
text----今天12:13
res---['2020-04-2312:13:00']
到此这篇关于python自动提取文本中的时间(包含中文日期)的文章就介绍到这了,更多相关python自动提取时间内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。