正则表达式检查日期

时间:2012-05-22 12:38:03

标签: python regex

您好我已经写了正则表达式来检查字符串中的字符串是什么样的 - 或者。或/或:或AM或PM或空格。如果字符串包含除AMP之外的字符,则我希望使case失败。 导入重新

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以外的字符串的任何建议。谢谢。

4 个答案:

答案 0 :(得分:1)

尝试一下:

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

正则表达式的更改

  • 它以^和$为基础,这意味着整行应匹配而不是部分
  • 将\ d添加到字符类以允许数字

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

你接近这种方式太过天真,无法处理像'-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

答案 3 :(得分:1)

有点精心制作,但有诀窍。

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'})