正则表达式未正确验证日期

时间:2012-03-21 13:27:26

标签: python regex validation tkinter

 def chkDay(x, size, part):
     dayre = re.compile('[0-3][0-9]') # day digit 0-9
     if (dayre.match(x)):
         if (len(x) > size):
             return tkMessageBox.showerror("Warning", "This "+ part +" is invalid")
             app.destroy
         else:
             tkMessageBox.showinfo("OK", "Thanks for inserting a valid "+ part)
     else:
         tkMessageBox.showerror("Warning", part + " not entered correctly!")
         root.destroy

#when clicked
chkDay(vDay.get(),31, "Day")

#interface of tkinter
vDay = StringVar()
Entry(root, textvariable=vDay).pack()

问题:

  • 没有验证,我可以放入超过31天但它仍然显示:确定
  • 当我调用 root.destroy 时,
  • root(application)不会关闭

4 个答案:

答案 0 :(得分:5)

使用正则表达式验证日期很难。您可以使用以下某些模式:http://regexlib.com/DisplayPatterns.aspx?cattabindex=4&categoryId=5&AspxAutoDetectCookieSupport=1

或来自http://answers.oreilly.com/topic/226-how-to-validate-traditional-date-formats-with-regular-expressions/

请记住,检查年份是否飞跃尤其困难,例如2011-02-29日期是否有效?

我认为最好使用专门的函数来解析和验证日期。您可以使用strptime()模块中的datetime

答案 1 :(得分:2)

让标准datetime库处理您的日期时间数据以及解析:

import datetime

try:
    dt = datetime.datetime.strptime(date_string, '%Y-%m-%d')
except ValueError:
    # insert error handling
else:
    # date_string is ok, it represents the date stored in dt, now use it

答案 2 :(得分:1)

31实际上是你的正则表达式,因为[0-3] [0-9]并不是你想要的。 您最好尝试将其强制转换为int并明确检查其边界。 否则正确的正则表达式将是([0-2]?\ d | 3 [01])以匹配0到31之间的数字

答案 3 :(得分:0)

为了限制1到31之间的值,您可以使用:

[1-9]|[12][0-9]|3[01]