时间:2021-05-22
有时在处理不规则数据时需要提取文本包含的时间日期。
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 reimport chardetfrom 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 resdef 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自动提取时间内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
最近在学习python,动手做了一个自动填写日报的小工具;由于请求中包含时间,格式如:2016-08-04;所以就了解了一下python的时间日期相关函数;这里
1.问题的描述用Python进行文本处理时,有时候处理的文本中包含中文、英文、日文等多个语系的文本,有时候不能同时进行处理,这个时候就需要判别当前文本是属于哪个
先简单的了解下日期和时间数据类型及工具python标准库包含于日期(date)和时间(time)数据的数据类型,datetime、time以及calendar模
本例介绍如何提取文本字符串中特定字符前或后的内容。软件名称:Excel2016forMacV16.9(多语中文版)苹果电脑版软件大小:774MB更新时间:201
本文实例为大家分享了Python批量提取PDF文件中文本的具体代码,供大家参考,具体内容如下首先需要执行命令pipinstallpdfminer3k来安装处理P