[Python] controllo della data

Alberto Granzotto agranzot a gmail.com
Sab 28 Lug 2012 21:42:59 CEST


2012/7/28 Daniele Varrazzo <piro a develer.com>

> On 2012-07-28 19:49, Giorgio Zoppi wrote:
>
>> Marco compariamo
>>
>> RegExp:
>> import re
>>
>> date = "01/02/1988"
>> checkdate ="^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[-
>> /.](19|20)\d\d"
>> obj = re.compile(checkdate)
>> if (re.match(date)):
>>      print 'Valid date'
>>
>
> Ti dice anche se un anno è bisestile?
>
>
>  Datetime
>> from datetime import datetime
>> date = '10/12/1977'
>> input = date.replace("/","")
>> result = None
>> format = ['%d%m%Y']
>>   try:
>>     result = datetime.strptime(input, format)
>>   except:
>>      pass
>>
>> if (result):
>>     print "Validate"
>>
>>
>> Il secondo e' piu pythonico...ma lungo. Hai altre opzioni?
>>
>
> Basta toglierci tutta la roba che non serve. Che poi che vuol dire, più un
> pezzo di codice è corto e meglio è? L'estetica del perl?
>
> from datetime import datetime
> input = '10/12/1977'
> try:
>     result = datetime.strptime(input, '%d/%m/%Y')
> except ValueError:
>     result = None
>
> (sebbene l'aggettivo "Pythonico" non sia esattamente ben definito, il tuo
> esempio *veramente* non lo era..)


totalmente d'accordo, e non sono nemmeno sostituibili. Semplicemente quella
con le RegExp è sbagliata, l'altra no, perché?

import re
re.match(
    "^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d",
    "31/02/1988") # nota bene, il 31 febbraio probabilmente non esiste

In questo caso con la regexp puoi magari avvicinarti alla correttezza, puoi
farle estremamente sofisticate e riconoscere i mesi da 30/31/28 giorni e
arrivare a considerare gli anni bisestili ottenendo qualcosa tipo:

 ^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$
[via <http://regexadvice.com/blogs/mash/archive/2004/04/02/300.aspx>]

ma si tratterebbe probabilmente di masturbazione più che programmazione :P

[scusate ho letto ora "ti dice anche se l'anno è bisestile, ma ormai avevo
scritto! :P]


> --
> Daniele Varrazzo - Develer S.r.l.
> http://www.develer.com
>
> ______________________________**_________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/**mailman/listinfo/python<http://lists.python.it/mailman/listinfo/python>
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20120728/916d408d/attachment.html>


Maggiori informazioni sulla lista Python