【问题标题】:python date regex expressionpython日期正则表达式
【发布时间】:2019-01-23 07:45:39
【问题描述】:

我正在尝试仅将日期添加到我的列表中。

pattern_six = re.compile(r'\d{1,2}-\d{1,2}-\d{4}')

不幸的是,这个正则表达式也选择了#2-1,这不是一个日期。
问题 1:我认为正则表达式只会遵循 X-X-X 模式,而不是 X-X。为什么我的假设是错误的?
问题 2:如何修复我的表达式以正确选择仅日期? 我尝试了这个表达式,但失败了。

pattern_six = re.compile(r'[^#](\d{1,2}-\d{1,2}-\d{4})')

提前感谢您的帮助:)

【问题讨论】:

  • 也许r'(?<!\S)\d{1,2}-\d{1,2}-\d{4}(?!\S)' 可以。
  • 我无法让您的第一次尝试匹配#2-1。真的匹配#2-1吗?你是怎么匹配的?

标签: python regex date


【解决方案1】:

我想这就是你需要的

((0[1-9]|[12]\d|3[01])-(0[1-9]|1[0-2])-[12]\d{3})

https://regex101.com/r/qC9cH4/56

【讨论】:

    【解决方案2】:

    这不是您应该尝试使用正则表达式解决的问题。为什么?请参阅 Jeppe Spanggaard 的回答。这似乎是正确的,但是呢:

    >>> re.match("((0[1-9]|[12]\d|3[01])-(0[1-9]|1[0-2])-[12]\d{3})", "31-02-2019")
    <_sre.SRE_Match object; span=(0, 10), match='31-02-2019'>
    

    但是 2019 年(或任何其他年份)没有 2 月 31 日!正则表达式处理模式,但日期不仅仅是模式,日期不是数字和破折号。它们要棘手得多(不同月份的天数不同,闰年......)。除非您有充分的理由,否则您应该始终使用库来处理日期(无论您使用什么语言):

    >>> from datetime import datetime as dt
    >>> dt.strptime("31-02-2019", "%d-%m-%Y")
    ...
    ValueError: day is out of range for month
    >>> dt.strptime("28-02-2019", "%d-%m-%Y")
    datetime.datetime(2019, 2, 28, 0, 0)
    

    如果你想测试一个字符串是否是你想要的格式的日期,你可以换行strptime

    >>> def to_date(s):
    ...     try:
    ...         return dt.strptime(s, "%d-%m-%Y")
    ...     except ValueError:
    ...         return None
    ... 
    >>> to_date("31-02-2019") is None
    True
    >>> to_date("28-02-2019")
    datetime.datetime(2019, 2, 28, 0, 0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多