【问题标题】:python regex of a date in some text某些文本中日期的python正则表达式
【发布时间】:2011-02-15 17:40:12
【问题描述】:

如何通过 python 从文本文件中找到尽可能多的日期模式?日期模式定义为:

dd mmm yyyy
  ^   ^
  |   |
  +---+--- spaces

地点:

  • dd 是两位数
  • mmm 是三个字符的英文月份名称(例如 Jan、Mar、Dec)
  • yyyy是四位数的年份
  • 有两个空格作为分隔符

谢谢!

【问题讨论】:

  • 我没有关注你。您是在寻找日期模式还是根据固定的单一模式寻找日期?
  • 我想提取实际日期。

标签: python regex


【解决方案1】:

这是一种查找与您的模式匹配的所有日期的方法

re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}', text)

但是在 WilhelmTell 对您的问题发表评论之后,我也想知道这是否是您真正要求的...

【讨论】:

    【解决方案2】:

    使用日历模块给你一点全球意识:

    date_expr = r"\d{2} (?:%s) \d{4}" % '|'.join(calendar.month_abbr[1:])
    print date_expr
    print re.findall(date_expr, source_text)
    

    对我来说,这会创建一个 date_expr,例如:

    "\d{2} (:?Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4}"
    

    但如果我使用语言环境模块更改我的语言环境:

    locale.setlocale(0, "fr")
    

    我现在用法语搜索月份:

    "\d{2} (?:janv.|févr.|mars|avr.|mai|juin|juil.|août|sept.|oct.|nov.|déc.) \d{4}"
    

    嗯,这是我第一次尝试法语月份缩写,我可能需要做一些清理工作:

    date_expr = r"\d{2} (?:%s) \d{4}" % '|'.join(
        m.title().rstrip('.') for m in calendar.month_abbr[1:])
    

    现在我明白了:

    "\d{2} (?:Janv|Févr|Mars|Avr|Mai|Juin|Juil|Août|Sept|Oct|Nov|Déc) \d{4}"
    

    现在我的脚本也可以为我的 Gallic 朋友运行,几乎没有什么麻烦。

    (您可能想知道为什么我必须从 [1:] 切分 month_abbr 列表 - 此列表以位置 0 的空字符串开头,因此如果您使用 find() 查找特定月份的缩写,您将从 1 到 12 取回一个数字,而不是从 0 到 11。)

    -- 保罗

    【讨论】:

    • 这就是为什么我更喜欢使用 RE 来验证基本格式(day month-abbrev year)然后让strptime 负责月份的本地化.如果您真的感兴趣,您可以使用一些区域设置感知选项来解释 M-D-Y 排序的差异。
    【解决方案3】:

    这里有一个稍微完整的例子。正则表达式将匹配的不仅仅是有效的日期值。 datetime.strptime 将无法解析任何无效的内容并引发ValueError。如果解析了日期,那么您就有了一个完整的 datetime 对象,可以让您访问很多功能。

    >>> from datetime import datetime
    >>> import re
    >>> dates = []
    >>> patn = re.compile(r'\d{2} \w{3} \d{4}')
    >>> fh = open('inputfile')
    >>> for line in fh:
    ...   for match in patn.findall(line):
    ...     try:
    ...       val = datetime.strptime(match, '%d %b %Y')
    ...       dates.append(val)
    ...     except ValueError:
    ...       pass # ignore, this isn't a date
    ...
    

    我想如果你愿意的话,这可以折叠成带有理解的紧凑代码。

    【讨论】:

    • 感谢! python - 如何将'val's连接到python中的数组中?
    【解决方案4】:

    试试这个:

    import re
    
    allmatches = re.findall(r'\d\d \w\w\w \d\d\d\d', "string to match")
    

    【讨论】:

    • 认真的吗? -1?除了 '\w\w\w' 之外的任何原因可能不是匹配一个月的好方法吗?这这家伙在他的“dd mmm yyyy”语法中所要求的。虽然它并不理想,但我不理解反对票。
    • 嗨,虽然很晚,但它可能会给出任意三个可以非常随机的字母数字字符?如果我错了,请纠正我
    【解决方案5】:

    或者你可以完全使用它

    date = re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s\d{2}:\d{2}', text)
    print date
    ['30 November 2010 14:20', '30 November 2010 14:24']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多