【问题标题】:Regex to check date正则表达式检查日期
【发布时间】:2012-05-22 12:38:03
【问题描述】:

您好,我已经编写了正则表达式来检查字符串在哪里具有类似 - 或 的字符。或 / 或 : 或 AM 或 PM 或空格。 follworig 正则表达式适用于此,但如果字符串包含 AMP 以外的字符,我想让大小写失败。 重新导入

Datere = re.compile("[-./\:?AMP ]+")

FD = { 'Date' : lambda date : bool(re.search(Datere,date)),}

def Validate(date):

    for k,v in date.iteritems():
        print k,v
        print FD.get(k)(v)

输出:

Validate({'Date':'12/12/2010'})
Date 12/12/2010
True
Validate({'Date':'12/12/2010 12:30 AM'})
Date 12/12/2010
True

Validate({'Date':'12/12/2010 ZZ'})
Date 12/12/2010
True  (Expecting False)

编辑: 验证({'日期':'12122010'}) 日期 12122010 假(期待假)

我怎么能找到除了 char APM 之外的字符串有任何建议。非常感谢。

【问题讨论】:

  • 您是在问如何捕获日期字符串,不包括'AM'、'PM'?
  • @möter 简而言之,只是假设字符串是基于字符串中存在的 -or/or:orAMP 或空格字符的日期

标签: python regex


【解决方案1】:

试试这个:

^[-./\:?AMP \d]*$

你的正则表达式的变化是

  • 它用 ^ 和 $ 锚定,这意味着整行应该匹配而不是部分匹配
  • \d 被添加到字符类以允许数字

现在正则表达式基本上读取为允许在 1 行上的符号列表

如果不希望空字符串匹配,请将 * 更改为 +

【讨论】:

  • +1 感谢@buckely,正则表达式可以完美捕获除 AMP 以外的字符,但如果我们提供 Validate({'Date':'12122010'}) 它应该会失败
  • 为什么会失败?我可以将日期 1212-20-10 读取为有效的 1212 年 20 月 10 日。同意 yyyyddmm 是一种奇怪的格式,但您现在是说我们不仅应该检查表格,还要检查内容是否有效?那么问题就变成了你想要支持什么格式。
  • @möter 验证语法还是验证含义?尽管正则表达式可用于区分现有日期和不存在日期,但它并不总是很漂亮。正则表达式主要用于验证语法,但也许 OP 认为它们更通用
【解决方案2】:

您可以改用这样的表达式:

^[-0-9./:AMP ]+$

^$ 将表达式锚定在字符串的开头和结尾,确保其中没有其他内容($ 之后的可选换行除外)。

【讨论】:

  • 此正则表达式下的“有效”日期字符串为:'-30/A-MP/2012/12'。
  • +1 @Thanks Qtax 正则表达式可以完美捕获除 AMP 以外的字符,但如果我们提供 Validate({'Date':'12122010'}) 它应该会失败 - Shashi
  • @möter,是的,甚至是:::,但没有人说过这个表达式试图验证日期。 (;
  • 考虑到 OP 的代码,我认为这很明显。还有标题。
【解决方案3】:

您处理此问题的方式过于幼稚,无法处理诸如“-30/A-MP/2012/12”、“-30/A-MP/20PA12/12”之类的乱码输入。

如果您想可靠地验证您的日期,如何:

import datetime
date = '12-12-2012 10:45 AM'
formats = ("%d-%m-%Y %I:%M %p", "%d/%m/%Y %I:%M %p", ...)
for fmt in formats:
    try:
        valid_date = datetime.datetime.strptime(date, fmt)
    except ValueError as e:
        print(e)

您必须定义所有可能的格式,但您将获得完整的日期时间对象(或时间或日期对象,它们的工作方式类似),并且您可以绝对确定它们是有效的。有关可用格式说明符的完整说明:http://docs.python.org/library/time.html#time.strftime

【讨论】:

    【解决方案4】:

    有点复杂,但确实有用。

    import re
    Datere = re.compile("""
        ^(?:\d\d[-./\:]){2} ## dd_SEP_dd
        \d{4}\s* ## year may be followed by  spaces
        (?:\d\d[-./\:]\d\d\s+(?:AM|PM))? ## hh_SEP_mm spaces followed by AM/PM and this is optional
        \s*$""",re.X)
    
    FD = { 'Date' : lambda date : bool(re.search(Datere,date)),}
    
    def Validate(date):
    
        for k,v in date.iteritems():
            print k,v
            print FD.get(k)(v)
    
    print Validate({'Date':'12/12/2010'})
    print Validate({'Date':'12/12/2010 12:30 AM'})
    print  Validate({'Date':'12/12/2010 ZZ'})
    

    【讨论】:

    • 在这个正则表达式下,12-20/2011 有效,2012-20-12 无效。
    • @möter,从 OP 示例中可以清楚地看出他/她的日期不会交换日/月/年的位置。所以你的第二个样本是没有发行人的。对于第一个,如果 OP 认为这是一个问题,我们可以捕获分隔符,然后在验证正则表达式中使用它。
    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多