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的Twisted框架实现webshell密码扫描器的教程
Apr 16 Python
按日期打印Python的Tornado框架中的日志的方法
May 02 Python
分享python数据统计的一些小技巧
Jul 21 Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
tf.truncated_normal与tf.random_normal的详细用法
Mar 05 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
python爬虫的一个常见简单js反爬详解
Jul 09 Python
python列表每个元素同增同减和列表元素去空格的实例
Jul 20 Python
PHP统计代码行数的小代码
Sep 19 Python
使用turtle绘制五角星、分形树
Oct 06 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
python 解决pycharm运行py文件只有unittest选项的问题
Sep 01 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/01/18 PHP
PHP 命名空间实例说明
2011/01/27 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
高一学生评语大全
2014/04/25 职场文书
爱心活动计划书
2014/04/26 职场文书
论文诚信承诺书
2014/05/23 职场文书
人力资源管理求职信
2014/08/07 职场文书
个人租房协议书样本
2014/10/01 职场文书
毕业生对母校寄语
2015/02/26 职场文书
个人借条范本
2015/05/25 职场文书
毕业感言怎么写
2015/07/31 职场文书
pytorch model.cuda()花费时间很长的解决
2021/06/01 Python