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采用requests库模拟登录和抓取数据的简单示例
Jul 05 Python
python获取mp3文件信息的方法
Jun 15 Python
Python 文件处理注意事项总结
Apr 10 Python
详细分析python3的reduce函数
Dec 05 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
浅谈python下含中文字符串正则表达式的编码问题
Dec 07 Python
python 猴子补丁(monkey patch)
Jun 26 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
django 简单实现登录验证给你
Nov 06 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
Apr 22 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 18 Python
Python中Permission denied的解决方案
Apr 02 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 解决utf-8和gb2312编码转换问题
2010/03/18 PHP
PHP 透明水印生成代码
2012/08/27 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
jQuery实现隔行背景色变色
2014/11/24 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
DOM 高级编程
2015/05/06 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
原生js三级联动的简单实现代码
2016/06/07 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
python实现数独算法实例
2015/06/09 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
python中set()函数简介及实例解析
2018/01/09 Python
python语音识别实践之百度语音API
2018/08/30 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
Python3 批量扫描端口的例子
2019/07/25 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
Python下载的11种姿势(小结)
2020/11/18 Python
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
汽车运用工程专业求职信
2014/06/18 职场文书
广告学专业求职信
2014/06/19 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
小班教师个人总结
2015/02/05 职场文书
小兵张嘎观后感
2015/06/03 职场文书
鸦片战争观后感
2015/06/09 职场文书
如何用python绘制雷达图
2021/04/24 Python
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL
实现一个简单得数据响应系统
2021/11/11 Javascript
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server