我試圖想出一種方法來以儘可能最好的pythonic方式來實現這一點。現在我能想到的唯一方法就是強行推行它。Python,日期驗證
用戶輸入以下列方式中的一個的日期(通過命令行)(來自./mypy.py日期=「20110909.00 23」)
date='20110909'
date='20110909.00 23'
date='20110909.00 20110909.23'
所有三個實施例應具有相同的結果,如果它填充一個列表(我可以排序),如
['20110909.00', '20110909.23]
,甚至兩個獨立的排序變量,但在所有情況下,它的YYYYMMDD.HH,並且需要確保它確實是一個沒關係日期而不是文字。
任何想法?
謝謝。
+++++編輯+++++ 插上這個之後,我想我需要先做很多日期檢查/操作。這似乎都很好。除了最後我通過日期驗證運行列表,並且每次都失敗 - 即使它應該通過。
./test.py日期(I與啓動它)= '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] [0-9] + \。[0-9] [0-9])') if re.match(thedate,item): print「validated」 ...' – Chasester