Path: csiph.com!newsfeed.xs4all.nl!newsfeed8.news.xs4all.nl!feeder5.feed.usenet.farm!feeder1.feed.usenet.farm!feed.usenet.farm!aioe.org!NmhHF3GLbzxJR67/r10DhQ.user.46.165.242.75.POSTED!not-for-mail From: Alain Ketterlin Newsgroups: fr.comp.lang.python Subject: Re: Python, angles et heures. Datetime ? Date: Sun, 14 Nov 2021 20:30:47 +0100 Organization: =?utf-8?Q?Universit=C3=A9?= de Strasbourg Message-ID: <87ee7iilg8.fsf@universite-de-strasbourg.fr.invalid> References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: gioia.aioe.org; logging-data="54265"; posting-host="NmhHF3GLbzxJR67/r10DhQ.user.gioia.aioe.org"; mail-complaints-to="abuse@aioe.org"; User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) X-Notice: Filtered by postfilter v. 0.9.2 Cancel-Lock: sha1:G8beXjYarfCGNUgDeFAyXsL5f9E= Xref: csiph.com fr.comp.lang.python:3632 Dominique writes: > En astronomie bas=C3=A9e sur des =C3=A9ph=C3=A9m=C3=A9rides, l'essentiel = des saisies se > fait sous forme d'angles (ddd:mm:ss ou ddd:mm.mm) et d'heures > (hh:mm:ss ou hh:mm.mm) > > Les heures et les angles sont d=C3=A9cimalis=C3=A9s (ddd.ddddd et hh.hhhh= ) puis, > =C3=A9ventuellement, transform=C3=A9s en notation normalis=C3=A9e (ddd:mm= :ss etc). > > J'ai =C3=A9crit un script qui contr=C3=B4le la conformit=C3=A9 de la sais= ie (rejeter > hh/mm/ss par exemple, ou ddd:mmm:ss) Aucun probl=C3=A8me aussi pour > d=C3=A9cimaliser ces saisies puis les retransformer en notations normales > (hh:mm:ss etc). > > Existe-t-il toutefois une librairie qui fait ce travail de contr=C3=B4le = de > la saisie et de sa transformation ? Il y a deux choses dans ta question : 1) v=C3=A9rifier que le texte a la bonne forme, et 2) le convertir en nombres. Et pour la premi=C3=A8re, une question annexe : le nombre de chiffres est-il fixe ? (Autrement dit : peut-on =C3=A9crire "1:2.3" pour 1 degr=C3=A9 2 minutes 3 secondes, ou bien doit-on =C3=A9crire "001:02.03" ? Dans tous les cas on peut utiliser des expressions r=C3=A9guli=C3=A8res (ou "rationnelles") pour faire le d=C3=A9coupage : import re Ensuite, voici une version (pour les degr=C3=A9s) qui permet un nombre quelconque de chiffres dans chaque partie, convertit, et teste explicitement les valeurs : ANGLE =3D re.compile ("([0-9]+):([0-9]+)[:.]([0-9]+)") def verif_degres (s): m =3D ANGLE.fullmatch (s) if m is None: return None else: d,m,s =3D int (m[1]), int (m[2]), int (m[3]) if d < 360 and m < 60 and s < 60: return d,m,s else: return None Si tu veux exactement 3 chiffres (puis 2 puis 2), il faut le pr=C3=A9ciser = =C3=A0 la place du "+" : ANGLE =3D re.compile ("([0-9]{3}):([0-9]{2})[:.]([0-9]{2})") On peut aussi v=C3=A9rifier l'intervalle de valeur avec une expression r=C3=A9guli=C3=A8re un peu plus compliqu=C3=A9e : ANGLE_ALT =3D re.compile ("([0-2][0-9][0-9]|3[0-5][0-9])" ":" "([0-5][0-9])" "[:.]" "([0-5][0-9])") def verif_degres_alt (s): m =3D ANGLE.fullmatch (s) if m is None: return None else: return (int (m[1]), int (m[2]), int (m[3])) Mais franchement, je ne suis pas s=C3=BBr que =C3=A7a vaille le coup. > Je regarde datetime > (https://docs.python.org/fr/3/library/datetime.html) mais je n'ai pas > l'impression d'y trouver ce que je cherche. C'est plus adapt=C3=A9 au calcul sur les dates et heures (un probl=C3=A8me = dont la complexit=C3=A9 surprend souvent), pas tellement =C3=A0 la v=C3=A9rificatio= n du format textuel (via strptime), en tout cas pas pour des degr=C3=A9s. -- Alain.