私はこれを可能な限り最善の方法で実現する方法を考えようとしています。今私が考えることができる唯一の方法は、それを強引にすることです。Python、日付検証
ユーザは、すべての3つの例は、同じ結果を有するべきである以下の方法(例。./mypy.py日付=「20110909.00 23」)
date='20110909'
date='20110909.00 23'
date='20110909.00 20110909.23'
のいずれかで(コマンドラインを介して)日付を入力しますそれは(私が並べ替えることができます)は、リストのような
['20110909.00', '20110909.23]
、あるいは2つのソート別々の変数が、すべての場合、それはYYYYMMDD.HHだ、と確認するために必要で、それは確かにあるが移入場合、それは問題ではありません。日付で、テキストではありません。
アイデア?
ありがとうございます。
+++++ EDIT +++++ これを取り除いた後、最初に多くの日付をチェック/操作する必要があると思っています。すべてがうまくいっているようだ。最後の日を除いて、私は日付の検証を通じてリストを実行し、毎回通過するときでさえ、失敗します。
(私はそれを起動する) ./test.py日付= '20110909.00 23'
(または日付のいずれかのバリエーション - すなわち日付= '20 22' または日付= '20110909' または日付=」 20110909.00 23' など)
import sys, re, time, datetime
now = datetime.datetime.now()
tempdate=[]
strfirstdate=None
strtempdate=None
temparg2 = sys.argv
del temparg2[0]
tempdate = temparg2[0].replace('date=','')
date = tempdate.split(' ');
tempdate=[]
date.sort(key=len, reverse=True)
result = None
# If no date is passed then create list according to [YYMMDD.HH, YYMMDD.HH]
if date[0] == 'None':
tempdate.extend([now.strftime('%Y%m%d.00'), now.strftime('%Y%m%d.%H')])
# If length of date list is 1 than see if it is YYMMDD only or HH only, and create list according to [YYMMDD.HH, YYMMDD.HH]
elif len(date) == 1:
if len(date[0]) == 8:
tempdate.extend([ date[0] + '.00', date[0] + '.23'])
elif len(date[0]) == 2:
tempdate.extend([now.strftime('%Y%m%d') + '.' + date[0], now.strftime('%Y%m%d') + '.' + date[0]])
else:
tempdate.extend([date[0], date[0]])
# iterate through list, see if value is YYMMDD only or HH only or YYYYMMDD.HH, and create list accoring to [YYYYMMDD.HH, YYYYMMDD.HH] - maximum of 2 values
else:
for _ in range(2):
if len(date[_]) == 8:
strfirstdate = date[0]
tempdate.append([ date[_] + '.00'])
elif len(date[_]) == 2:
if _ == 0: # both values passed could be hours only
tempdate.append(now.strftime('%Y%m%d') + '.' + date[_])
else: # we must be at the 2nd value passed.
if strfirstdate == None:
tempdate.append(now.strftime('%Y%m%d') + '.' + date[_])
else:
tempdate.append(strfirstdate + '.' + date [_])
else:
strfirstdate = date[0][:8]
tempdate.append(date[_])
tempdate.sort()
for s in tempdate:
try:
result = datetime.datetime.strptime(s, '%Y%m%d.%H')
except:
pass
if result is None:
print 'Malformed date.'
else:
print 'Date is fine.'
print tempdate
++++編集2 ++++ 私は(tempdate.sort後に()下の部分を削除)し、これと交換した場合。
strfirstdate = re.compile(r'([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]+\.[0-9][0-9])')
for s in tempdate:
if re.match(strfirstdate, s):
result = "validated"
else:
print "#####################"
print "#####################"
print "## error in date ##"
print "#####################"
print "#####################"
exit
適切に検証されます。
この全体的な方法は、非常にpythonicではないようです。
何とかブルートフォースを意味しますか?明らかに、あなたが示したさまざまなケースを分けるために、いくつかのロジックを実装する必要があります。ちょうどそれを行い、あなたのコードを示してください。そして私たちはあなたにそれをもっとpythonicにするのを手伝います。 – Achim
@Achim私がやったのは、番号の検証より2長い場合は、アイテムの長さを最初に探すことでした。そうでなければ、正規表現に対して を検証する 'thedate = re.compile(r '([0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] re.match(thedate、item): print "validated" ... ' – Chasester