Je veux vérifier si une chaîne correspond à un certain format de chaîne à l'aide de listes comme ceci: mais cela ne semble pas être le moyen de le faire, est-ce même possible ? p> p>
4 Réponses :
Je vous recommanderais d'utiliser Date .Fromisoformat () Code> pour convertir la chaîne en date code> objet et vérifiez ensuite si la date est après 2015.
code: strong> p> from datetime import datetime
fn = "2016-10-28"
assert 2015 <= datetime.strptime(fn, "%Y-%m-%d").year <= 2100
Je sais que le assertionError code> est intentionnel, mais savez-vous que ValueError code> sera également soulevé dans certains cas?
@Annzen, c'est juste du code de test, pas une solution complète, alors laissez-le être
D'accord, mais date.fromisoformat code> neuf en 3.7. J'utilise Ubuntu 18.04LTS, publié dans le 2020 février, et il a 3,6.
@alaniwi, vous pouvez utiliser d'autres options supplémentaires.
Les deux autres options (et éventuellement le premier, je ne saurais pas) acceptera '2020-6-21' code>. Maintenant, si l'intention est de accepter i> mois ou jours à un chiffre à un chiffre (pour les dates valides), alors super. Mais la question est vague et éventuellement i> l'intention est de vérifier si la date est conforme au format AAAA-MM-DD, auquel cas il a besoin d'une analyse plus stricte. Je pense que la clarification de l'OP est requise.
@Anzen en expansinant sur votre merveilleux AssertionError code> Observation, tous les tests auraient faux, car le générateur de liste de OP produise des valeurs d'année seulement jusqu'à 2099. Selon cet ensemble d'affirmations, "2100-01- 01 " code> passerait de manière incorrecte.
@Markmoretto, supprimez un symbole.
Vous pouvez convertir la chaîne en une date date code>, puis comparer aux limites également dans date code> objets. Cela bénéficie des avantages que des choses comme la mauvaise journée de jour pour le mois sont capturées. import datetime
def in_bounds(datestr, mindate=datetime.date(2015, 1, 1),
maxdate=datetime.date(2100,12,31)):
print('try', datestr)
try:
mydate = datetime.datetime.strptime(datestr,"%Y-%m-%d").date()
print('got', mydate)
if not mindate <= mydate <= maxdate:
print('out of bounds')
raise ValueError()
except ValueError:
print("fail")
else:
print("pass")
test = ["2015-2-11", # good
"2015-1-01", # good
"2100-12-31", # good
"2014-12-31", # low
"2101-1-1", # high
"2020-9-31", # 30 days in september
"2020-13-2", # bad month
"These are the times", # not a date
]
for datestr in test:
in_bounds(datestr)
Intéressant, dans Docs a déclaré: % M CODE> - Mois comme un Numéro décimal cadmé B>, mais cela fonctionne en fait sans. Désolé, ils ont également mentionné ensuite: Lorsqu'il est utilisé avec la méthode STRPTIME () code>, le zéro avancé est facultatif pour les formats % d code>, % m Code>, % h code>, % i code>, % m code>, % s code>, % j Code>, % u code>, % w code> et % v code>. Format % y code> nécessite un zéro directeur. I>
@Olvinroght - Oui, et la documentation est gênante de cette façon. Il utilise les mêmes codes pour l'analyse et l'impression. StrfTime CODE> PADS AVEC ZEROS, mais STRIPTIME CODE> ne les nécessite pas. J'ai remarqué que je n'ai pas vérifié les limites correctement. J'ai ajouté quelques tests supplémentaires.
Oh, je n'ai pas remarqué qu'ils documentent cela. Je viens de maudit l'obscurité.
Voici une solution simple: strong> b
Solution plutôt inefficace pour être honnête.
Vous pouvez toujours utiliser des expressions régulières!
a
Qu'en est-il de "2017-2-30" code>?
Ne sera pas correct car 2 code> doit être rembourré, la liste d'OP. Sinon, vous pouvez utiliser r "\ d {4} - \ d {1,2} - \ d {1,2} - \ d {1,2}" code> Pour tenir compte des jours et des mois à zéro.
Ce n'est pas rembourré dans l'exemple fourni en op, mais même si ce sera le cas, ce n'est pas la date correcte.
La question @olvinroght est si vague que je ne sais pas si elle est tenue d'accepter ce format (en dehors du mauvais nombre de jours en février) ou de se plaindre que ce n'est pas yyy-mm-dd.
La production de l'affaire de test de OP devrait être «B», indiquant qu'il n'y a pas de match. Formatage comme "% 02d" code> signifie deux taches avec un remplissage zéro si la valeur numérique est un seul chiffre. Avez-vous essayé le code de OP? On dirait que vous sautez simplement autour de la critique de tout le monde dans l'espoir que votre solution est sélectionnée.
@alaniwi à coup sûr, lorsqu'il s'agit de vérifier les formats de date, il y a beaucoup à considérer et à utiliser quelque chose de la bibliothèque standard est probablement la meilleure idée.
@Markmoretto, restez calme, je viens de pointer des erreurs possibles.
S'il vous plaît coller le code complet.
Désolé j'ai cliqué sur post accidentellement lol
@Pythonieer, Acceptez Réponse qui vous a aidé le plus ou au moins commentez pourquoi vous ne pouvez appliquer aucun d'entre eux.