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爬虫模拟登录带验证码网站
Jan 22 Python
Python编程中对super函数的正确理解和用法解析
Jul 02 Python
Python3 socket同步通信简单示例
Jun 07 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
Oct 21 Python
python 用opencv调用训练好的模型进行识别的方法
Dec 07 Python
Django 过滤器汇总及自定义过滤器使用详解
Jul 19 Python
python中for循环把字符串或者字典添加到列表的方法
Jul 20 Python
Django 重写用户模型的实现
Jul 29 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
python如何调用字典的key
May 25 Python
python内置模块之上下文管理contextlib
Jun 14 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新手谈谈我的学习心得
2007/02/25 PHP
CentOS 6.3下安装PHP xcache扩展模块笔记
2014/09/10 PHP
功能强大的PHP发邮件类
2016/08/29 PHP
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
vue学习笔记之v-if和v-show的区别
2017/09/20 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
2020/03/04 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
Python中str.join()简单用法示例
2018/03/20 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
Python流程控制 while循环实现解析
2019/09/02 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
应聘面试自我评价
2014/01/24 职场文书
社区服务活动小结
2014/07/08 职场文书
离婚纠纷代理词
2015/05/23 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
python numpy中setdiff1d的用法说明
2021/04/22 Python
python绘制箱型图
2021/04/27 Python
Pytorch DataLoader shuffle验证方式
2021/06/02 Python
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
python flappy bird小游戏分步实现流程
2022/02/15 Python
A22国内电台短波广播频率表
2022/05/10 无线电