python自动提取文本中的时间(包含中文日期)


Posted in Python onAugust 31, 2020

有时在处理不规则数据时需要提取文本包含的时间日期。

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自动提取时间内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现控制台输入密码的方法
May 29 Python
在Python中移动目录结构的方法
Jan 31 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
教你怎么用python爬取爱奇艺热门电影
May 20 Python
详解python字符串驻留技术
May 21 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 Python
Django框架中视图的用法
Jun 10 Python
Python Selenium自动化获取页面信息的方法
Aug 31 #Python
python+requests接口自动化框架的实现
Aug 31 #Python
python如何导出微信公众号文章方法详解
Aug 31 #Python
Python生成并下载文件后端代码实例
Aug 31 #Python
python exit出错原因整理
Aug 31 #Python
Python如何将模块打包并发布
Aug 30 #Python
如何以Winsows Service方式运行JupyterLab
Aug 30 #Python
You might like
php不用正则采集速度探究总结
2008/03/24 PHP
php 动态执行带有参数的类方法
2009/04/10 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
浅谈js的setInterval事件
2014/12/05 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
vue实现搜索功能
2019/05/28 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
python3实现暴力穷举博客园密码
2016/06/19 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
解决python运行效率不高的问题
2020/07/20 Python
Python Http请求json解析库用法解析
2020/11/28 Python
Django如何重置migration的几种情景
2021/02/24 Python
什么是.net
2015/08/03 面试题
质量承诺书怎么写
2014/05/24 职场文书
个人务虚会发言材料
2014/10/20 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
2019职场单身人才调研报告:互联网行业单身比例最高
2019/08/07 职场文书
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL