python自动提取文本中的时间(包含中文日期)
作者:古月月月胡 发布时间:2023-08-22 21:32:11
标签:python,自动提取,时间
有时在处理不规则数据时需要提取文本包含的时间日期。
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']
来源:https://www.cnblogs.com/i-love-python/p/12763063.html


猜你喜欢
- if判断判断的定义 如果条件满足,就做一件事;条件不满足,就做另一件事; 判断语句又被称为分支语句,有判断,才有分支;i
- 在Internet上我们每天都会遇到数不清的表单,也看到其中大部分并没有限制用户多次提交同一个表单。缺乏这种限制有时候会产生某些预料不到的结
- 本文实例讲述了mysql中GROUP_CONCAT的使用方法。分享给大家供大家参考,具体如下:现在有三个表,结构如下:cate表:CREAT
- 一、从外部文档中粘贴时,如果只要文字而不想要其格式,可以使用“Edit→paste as text”命令,不要直接用Ctrl+V。二、当有浏
- create procedure test_tran as set xact_abort on -----用@@error判断,对于严重的错
- 一、简介Locust 是一个易于使用,分布式,用户负载测试工具。它用于负载测试 web 站点(或其他系统),并计算出一个系统可以处理多少并发
- 1.html代码片段<div class="layui-input-inline"> &nbs
- 切片——str[start:end]str1 = ' python str '#切片
- 1、启动SQL Server Management Studio,以Windows身份验证方式登录。2、在对象资源管理器窗口中,右键单击服务
- 前言安全性是所有数据库管理系统的一个重要特征。理解安全性问题是理解数据库管理系统安全性机制的前提。最近和同事在做数据库权限清理的事情,主要是
- vue-router路由懒加载 和权限控制,今天刚好搞了一个基于node token验证的小demo所以下面介绍下,路由懒加载1、为什么要使
- 如何解决bootStrapValidator bootStrap-select验证不可用,只要三步:思路:把多选下拉框的选中值,赋给一个隐藏
- Metro风格设计主要特点 1.Windows 8 Metro风格设计,实现网站或系统功能的导航 2.纯Javascript实现 3.支持所
- 使用 Python 对数据进行更新操作对于 es 的更新的操作,不用到 Search() 方法,而是直接使用 es 的连接加上相应的函数来操
- TSNE降维降维就是用2维或3维表示多维数据(彼此具有相关性的多个特征数据)的技术,利用降维算法,可以显式地表现数据。(t-SNE)t分布随
- Vue中子组件调用父组件的三种方法:1.直接在子组件中通过“this.$parent.event”来
- 前言金融行业的Python学习,不同于IT系统开发,我们并不需要达到程序员的水平。然而,学会Python可以让你实现一个人写完一个交易系统的
- 如果直接执行SQL语句或者参数绑定则不用担心太多,如以下ORACLE存储过程 create or replace&nbs
- 1.如果每页都增加打印时间,又如何设置?打印时间的,你可以参考 for(var i=0;i<page.length;i++)
- 要实现的目标,简单示例:from functools import partialdef func1(f): re