一起来写个通用时间正则匹配吧

正则表达式在我爬虫开发中用的很频繁。尤其是当XPath和cssSelector 有心无力的时候。
现在,我遇到了一个这样的问题。我要爬取几十个网站的文章页,但是可能每个网站有自己的格式,我要汇总各种网站格式,然后将时间戳抽取出来。网站时间格式大致如下:

  • 年月日:
    • 2017-09-25 2017/09/25 2017.09.25 2017年09月25日
  • 年月日 时分:
    • 2017-09-25 18:59 2017/09/25 18:59
  • 年月日 时分秒:
    • 2017-09-25 18:59:48 2017年09月25日18:59:54
  • xx时间前:
    • 1分钟前 1 小时前 1天前 (这里暂时不考虑英文,其实差不多)

先把正则表达式放出来

(20\d{2}([\.\-/|年月\s]{1,3}\d{1,2}){2}日?(\s?\d{2}:\d{2}(:\d{2})?)?)|(\d{1,2}\s?(分钟|小时|天)前)

然后是结果

接下来我们就来构造这正则表达式
咋一看,挺复杂的正则表达式,但是无非就是那些语法构成,只要耐心点就很容易写出来

首先,我们要匹配日期,日期无非就 xxxxxx 这种格式,我们要主义的是三串数字之间的字符 比如 2017-09-25 2017/09/25 2017.09.25 这种无非就是分隔符的微弱区别。而我要抓的也仅是20xx年以后的东西,所以我可以这样写:
20\d{2}表示年份 d{1,2}表示月日 因为月份有 2 和02 两种情况
而中间的符号,常见的有 . \ 空格 中文这几种情况,根据自己需求可以酌情添加。
这样我们就把中间符号正则写出来了- [\.\-/|年月\s] .和- 需要转义,
还要注意的是 中文的时间后边可能会有个 日 字 所以也要匹配上,当然你可以选择用 * 但是我感觉效率应该没有固定了的高
接下来我们就该匹配时间了,时间这个相对简单,因为格式相对固定,区别在于有没有秒数。
根据之前的规则,我们可以很轻易写出 (\s\d{2}:\d{2}(:\d{2})?)?这里不再赘述。

然后是匹配 某个xx之前,这里需要注意的是,数字有一位或者两位之分以及数字和文字之间是否有空格,根据需求写出\d{1,2}\s?(分钟|小时|天)前

剩下的就是拼接了,日期和时间点之间是或的关系,所以需要 | 符号,
就这样一个正则表达式就写出来了

补上测试代码:

time_test = ['2017年09月25日', '2017-09-25','2017/09/25','2017 09 25', '2017年09月25日19:13:33', '2017-09-25 19:13:40','1小时前','1 天前']
for i in time_test:
    post_time = re.search(
        '(20\d{2}([\.\-/|年月\s]{1,3}\d{1,2}){2}日?(\s?\d{2}:\d{2}(:\d{2})?)?)|(\d{1,2}\s?(分钟|小时|天)前)',i)
    print(post_time)

正文结束,接下来是怎样将时间转换为时间戳,这里我用到了一个第三方库dateparser

附上相关代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
import dateparser
import time
import random

time_re = re.compile('[年月日\s]')

def generate_timestamp(post_time):
    now = int(time.time())
    date_time = dateparser.parse(time_re.sub(' ', post_time))
    if date_time:
        time_stamp = int(date_time.timestamp())
    else:
        return now
    if time_stamp > now:
        time_stamp = now - random.randint(0, 600)
    return time_stamp
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 4,075评论 0 20
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,617评论 0 17
  • 正则表达式 \n\n\n 【5】正则表达式应用——删除空行 启动EditPlus,打开待处理的文本类型文件。 ①、...
    黄花菜已凉阅读 1,074评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • 一、什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否...
    呆呆滴木木菇凉阅读 576评论 0 0