Прикреплённый файл «re_year.py»

Загрузка

   1 #!/usr/bin/env python
   2 # coding: utf
   3 '''
   4 Является ли данная строчка датой в формате dd/mm/yyyy. Начиная с 1600 года до 9999 года
   5 '''
   6 
   7 # Високосный год:
   8 # Иными словами, год является високосным, если он кратен 4 и при этом не кратен 100, либо кратен 400. Год не является високосным, если он не кратен 4, либо кратен 100 и не кратен 400.
   9 # Последние годы столетий, оканчивающиеся на два нуля, в трёх случаях из четырёх не являются високосными. Так, годы 100, 200, 300, 500, 600, 700, 900, 1000, 1100, 1300, 1400, 1500 (до введения григорианского календаря), 1700, 1800 и 1900 не являются високосными, так как они кратны 100 и не кратны 400. Годы 400, 800, 1200 (до введения григорианского календаря), 1600 и 2000 — високосные
  10 
  11 import re, sys
  12 
  13 sreLeap=r"(?:{Div4}00|\d\d(?!00){Div4})".format(    # Високосный год
  14    Div4=r"(?:[02468][048]|[13579][26])")            # Делится на 4
  15 if len(sys.argv)<2: print "sreLeap:\t",sreLeap
  16 
  17 # Месяц, допустимые числа
  18 MDays=((r"01|03|05|08|10|12",                   r"[012]\d|3[01]"),  # 31 день
  19        (r"04|06|07|09|11",                      r"[012]\d|30"),     # 30 дней
  20        (r"(?<={Leap}/)02".format(Leap=sreLeap), r"[012]\d"),        # 29 дней
  21        (r"(?<!{Leap}/)02".format(Leap=sreLeap), r"[01]\d|2[0-8]"),  # 28 дней
  22 )
  23 
  24 sreDay="|".join(("(?:(?:{0})/(?:{1}))".format(m,d) for m,d in MDays))
  25 if len(sys.argv)<2: print "preDay:\t",sreDay
  26 
  27 sreData=r"\d\d\d\d/(?:{Day})$".format(Day=sreDay)
  28 if len(sys.argv)<2: print "sreData:\t",sreData   # Отладка
  29 
  30 reData=re.compile(sreData)
  31 if len(sys.argv)<2: # генератор тестов
  32     import random
  33     for i in xrange(10):
  34         d="{0}/{1:02}/{2:02}".format(   random.randint(1000,10000),
  35                                         random.randint(0,13),
  36                                         random.randint(0,33))
  37         print d, reData.match(d) and "Yes" or "No"
  38     d="1900/02/29"; print d, reData.match(d) and "Yes" or "No"
  39     d="1904/02/29"; print d, reData.match(d) and "Yes" or "No"
  40     d="1931/02/29"; print d, reData.match(d) and "Yes" or "No"
  41     d="1931/04/31"; print d, reData.match(d) and "Yes" or "No"
  42 else:
  43     for y in sys.argv[1:]:
  44         print y, reData.match(y) and "Yes" or "No"

Прикреплённые файлы

Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.

Вам нельзя прикреплять файлы к этой странице.