1

私はこれを読んで本当に興味を持ちました:正規表現を使用した日付形式の検証

それで、私は自分のバージョンの日付検証関数を書き始めました。私は近いと思いますが、完全ではありません。いくつかの提案とヒントが必要です。関数を微調整するのに多くの時間を費やしました。

import re
import datetime

# Return True if the date is in the correct format
def checkDateFormat(myString):
    isDate = re.match('[0-1][0-9]\/[0-3][0-9]\/[1-2][0-9]{3}', myString)
    return isDate

# Return True if the date is real date, by real date it means,
# The date can not be 00/00/(greater than today)
# The date has to be real (13/32) is not acceptable
def checkValidDate(myString):
    # Get today's date
    today = datetime.date.today()
    myMaxYear = int(today.strftime('%Y'))

    if (myString[:2] == '00' or myString[3:5] == '00'):
        return False

    # Check if the month is between 1-12
    if (int(myString[:2]) >= 1 or int(myString[:2]) <=12):
        # Check if the day is between 1-31
        if (int(myString[3:5]) >= 1 or int(myString[3:2]) <= 31):
            # Check if the year is between 1900 to current year
            if (int(myString[-4:]) <= myMaxYear):
                return True
    else:
        return False

testString = input('Enter your date of birth in 00/00/0000 format: ')

# Making sure the values are correct
print('Month:', testString[:2])
print('Date:', testString[3:5])
print('Year:', testString[-4:])

if (checkDateFormat(testString)):
    print('Passed the format test')
    if (checkValidDate(testString)):
        print('Passed the value test too.')
    else:
        print('But you failed the value test.')
else:
    print("Failed. Try again")

質問1:int(myString[3:5])それが有効かどうかを比較したいときに他の(より良い)方法はありますか?私の方法は非常に反復的であり、この関数には00/00/0000が必要であると感じています。そうしないと、機能しなくなります。したがって、この関数はその意味ではそれほど有用ではありません。特に私が自分を扱う方法は00/01/1989、単にifそれらが実際にあることを比較しているだけです00

質問2:多くのif声明がありますが、このテストを書くためのより良い方法があるのだろうか?

Pythonでのプログラミングについてもっと知りたいのですが、提案やアドバイスをいただければ幸いです。どうもありがとうございます。

4

5 に答える 5

3

Pythonの多くのものと同様に、日付をチェックするための基本的な機能がすでにあります。学術的な演習としてこれを行っているだけではないと仮定すると、日付を検証する最も簡単な方法は、日付を作成してみることです。

import datetime

minyear = 1900
maxyear = datetime.date.today().year

mydate = '12/12/2000'
dateparts = mydate.split('/')
try:
    if len(dateparts) != 3:
       raise ValueError("Invalid date format")
    if int(dateparts[2]) > maxyear or int(dateparts[2]) < minyear:
       raise ValueError("Year out of range")
    dateobj = datetime.date(int(dateparts[2]),int(dateparts[1]),int(dateparts[0]))
except:
    // handle errors

datetime.dateに無効な日付が指定されている場合、次のように文句を言います。

datetime.date(2000,45,23)

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    datetime.date(2000,45,23)
ValueError: month must be in 1..12
于 2012-04-03T23:12:16.417 に答える
1

アカデミックエクササイズにはある程度の価値があることを理解しています。私は彼らを落胆させません。

また、Pythonの学習の大部分は、どの問題がすでに解決されているかを発見することだと思います。私がこのように考える理由はいくつかあります。まず、車輪の再発明をするのは時間の無駄だと思います。また、コードや問題を解決するためのさまざまなアプローチを学ぶ機会もあります。最後に、長年の解決策は、主題の癖について素朴である可能性が低いと思います。

そのことを念頭に置いて、dateutilライブラリをお勧めします。

于 2013-04-25T13:53:46.190 に答える
1
from dateutil.parser import *
parse("1993-09-01")
datetime.datetime(1993, 9, 1, 0, 0)

形式が適切でない場合は、ValueErrorが発生します。アプリケーションが予期せず終了しないように、try..catchを使用してそれらをキャッチできます。

于 2014-07-31T16:22:52.927 に答える
1

上記のいくつかの回答に基づいて、日付をDD / MM/YYYYの形式で検証するこの短いコードを作成しました。

date = "29/02/2016"

min_year = 1900
max_year = min_year + 200

days_31 = ['01', '03', '05', '07', '08', '10', '12']
days_30 = ['04', '06', '10', '11']
days_28 = ['02']

month_dict = {'01':'January',
      '02':'February',
      '03':'March',
      '04':'April',
      '05':'May',
      '06':"June",
      '07':'July',
      '08':'August',
      '09':'September',
      '10':'October',
      '11':'November',
      '12':'December'}

def validate(day, month, leap_year_or_not):
    if leap_year_or_not:
        max_day = 29
    else:
        max_day=28
    if month in days_28:
        if day > max_day:
            print "Invalid day: %s for month %s" %(day, month_dict[month])
            return False
        else:
            return True
    elif month in days_30:
        if day > 30:
            print "Invalid day: %s for month %s" %(day, month_dict[month])
            return False
        else:
            return True
    elif month in days_31:
        if day <= 31:
            return True
        else:
            print "Invalid day: %s for month %s" %(day, month_dict[month])
            return False
    else:
        print "Invalid month:%s, Invalid day:%s" %(month, day)
        return False

if len(date)!= 10:
    print "Invalid Format. Please enter date in DD/MM/YYYY"
else:
    day, month, year = date.split("/")
    if len(day) != 2:
        print "Length of day in not 2. Please enter day as 01 for first!" 
    elif len(month) != 2:
        print "Length of month in not 2. Please enter month as 01 for January!"
    elif len(year) != 4:
        print "Length of year in not 4. Please enter year as 2001!"
    else:
        day=int(day)
        month=int(month)
        year=int(year)
        if day < 1 or day > 31:
            print "Day %s is not in range [1-31]" %str(day)
        else:
            if month < 1 or month > 12:
                print "Month %s is not in range [1-12]" %str(month)
            else:
                if year < min_year or year > max_year:
                    print "Year is not in range [%s-%s]" (str(min_year), str(max_year))
            else:
                if year%4 == 0:
                    leap_year = True
                else:
                    leap_year = False
                valid_day_month = validate(day, str(month).zfill(2), leap_year)
于 2016-11-02T15:38:35.157 に答える
-1
import time
import datetime
self.date = raw_input('Enter the date to travel in (yyyy-mm-dd) format: ')
try:
    valid_date = time.strptime(self.date, '%Y-%m-%d')
    today_date=str(datetime.date.today())
    if self.date<today_date:
        print "date got over"
    else:
        print " "
except ValueError:
print('Invalid date!')
于 2015-01-09T03:11:56.823 に答える