cette question est peut-être dupliquée mais je n'ai pas trouvé de solution exacte à cela. J'ai ce type de chaîne qui inclut la date et l'heure.
"check_in": "10/25/2019 14:30"
J'ai besoin d'en extraire une heure mais ce n'est pas toujours un format valide. J'ai essayé ce modèle jusqu'à présent, mais il inclut le caractère ":".
\ d +? (:)
(\ d + :)
(\ d +) *:
3 Réponses :
\d+(?=:) DemoYou don't need match the :, but need check it. So use Positive Lookahead (?=:).
Les expressions régulières ne sont pas toujours la meilleure façon de traiter les chaînes représentant des dates, surtout si vous ne pouvez pas compter sur le format d'entrée pour être cohérent. Utilisez à la place un analyseur spécialisé:
>>> from dateutil import parser
>>> parser.parse("10/25/2019 14:30").hour
14
>>> parser.parse("10/25/2019 2:30 PM").hour
14
>>> parser.parse("2019-10-25T143000").hour
14
Le module dateutil n'est pas dans la bibliothèque standard mais vaut bien la peine d'être téléchargé.
Tout d'abord, voici ce qui ne va pas avec vos expressions régulières:
\ d +? (:) - trouve le numéro et la colonne ( 14: ) et place la colonne dans un groupe (\ d + :) - trouve le numéro et la colonne ( 14: ) et met tout cela dans un groupe (\ d +) *: - trouve (éventuellement, à cause de * ) le numéro et la colonne ( 14: ) et met le numéro en groupe Donc, le dernier pourrait fonctionner:
>>> import datetime
>>> datetime.datetime.strptime("10/25/2019 14:30", "%m/%d/%Y %H:%M")
datetime.datetime(2019, 10, 25, 14, 30)
Mais là encore, cela donnerait un résultat erroné (au lieu de casser) sur quelque chose comme "temps: 14:30 ", ce qui rend difficile le débogage de l'erreur plus tard. Ce que vous voulez, c'est utiliser une recherche plus stricte, par exemple faire correspondre la chaîne entière et étiqueter tous les groupes:
>>> regex = r'(?P<month>\d\d)/(?P<day>\d\d)/(?P<year>\d{4}) (?P<hour>\d\d):(?P<minute>\d\d)'
>>> re.search(regex, "10/25/2019 14:30").group('hour')
'14'
Un autre moyen plus simple et encore plus sûr est d'utiliser strptime:
>>> match = re.search(r'(\d+)*:', "10/25/2019 14:30") >>> match.group(0) # whole result '14:' >>> match.group(1) # just the number '14'
Vous avez maintenant l'objet datetime complet et vous pouvez extraire le .hour si vous le souhaitez.