Regex неправильно проверяет дату - PullRequest
1 голос
/ 21 марта 2012
 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, и он по-прежнему показывает: OK
  • root (приложение) не закрывается, когда яЗвоните root.destroy

Ответы [ 4 ]

5 голосов
/ 21 марта 2012

Проверка даты с регулярным выражением трудна. Вы можете использовать несколько шаблонов из: 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 модуля.

2 голосов
/ 21 марта 2012

Пусть стандартная библиотека 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
1 голос
/ 21 марта 2012

31 на самом деле в вашем регулярном выражении, потому что [0-3] [0-9] не совсем то, что вы ищете. Вы бы лучше попытались привести его к int и явно проверить его границы. В противном случае правильное регулярное выражение будет ([0-2]? \ D | 3 [01]) для совпадения числа от 0 до 31

0 голосов
/ 21 марта 2012

Чтобы ограничить значения от 1 до 31, вы можете использовать:

[1-9]|[12][0-9]|3[01]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...