有时在处理不规则数据时需要提取文本包含的时间日期。
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自动提取时间内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】