J'ai une chaîne datetime et je veux séparer le format de l'heure du format des minutes, puis les imprimer tous les deux sur une ligne distincte. Voici le code:
import re from datetime import datetime ct = datetime.now().strftime("%H:%M") time = "12:30" minus = datetime.strptime(time,"%H:%M") - datetime.strptime(ct,"%H:%M") minus = datetime.strptime(str(minus),"%H:%M:%S").strftime("%H:%M") # print(minus) regex2 = re.compile(r'(\d)+:(\d)+') match = regex2.search(minus) print(match.group(0))
Si la variable moins donne une sortie: 01:22 Alors je veux qu'elle 01 et 22 soient imprimées sur des lignes différentes.
La sortie devrait être comme:
01
22
3 Réponses :
En ignorant le fait que votre script échoue en raison d'une erreur d'exécution à la ligne 6 (qui empêche toute sortie d'être générée à partir de la partie regex du script), pour capturer les chiffres entourant les deux-points, vous devez mettre le marqueur de répétition (c'est-à-dire le signe plus) à l'intérieur des marqueurs de capture (c'est-à-dire la parenthèse). Révisez donc votre regex:
print(match.group(1)) print(match.group(2))
comme suit:
regex2 = re.compile(r'(\d+):(\d+)')
J'y parviendra.
La deuxième chose que vous devez faire est d'imprimer les groupes correspondants (par opposition à l'intégralité du texte correspondant - c'est-à-dire group (0)). L'impression des premier et deuxième groupes correspondants est réalisée comme suit:
regex2 = re.compile(r'(\d)+:(\d)+')
La différence entre votre expression régulière et la mienne résidait dans le nombre de groupes qui seraient finalement générés sur une correspondance. Dans votre cas (\ d) + vous avez demandé la création d' un ou plusieurs groupes d'un seul chiffre . Dans mon cas (\ d +) je demande la création d' un seul groupe contenant un ou plusieurs chiffres . J'utilise ensuite ce modèle deux fois - une fois de chaque côté du côlon.
Donc, pour une entrée comme celle-ci 01:22, vous auriez créé 4 groupes étant "0", "1", "2" et "2". Alors que mon regex ne générerait que 2 groupes "01" et "22". Je pense que c'est ce que vous essayez d'accomplir.
Notez que si vous aviez une entrée comme celle-ci "0: 122", votre expression régulière aurait généré les 4 mêmes groupes ("0", "1", "2" et "2") - vous n'auriez aucune idée d'où le " : "caractère était sauf si vous l'avez également capturé (les deux points). Dans mon RE, l'entrée "0: 122" générerait "0" et "122" vous informant ainsi correctement où se trouvaient les deux points (c'est-à-dire entre le "0" et le "122"
vous n'avez pas besoin de regex pour cela.
vous pouvez utiliser timedelta directement:
from datetime import datetime ct = datetime.now().strftime("%H:%M") time = "10:30" minus = datetime.strptime(time,"%H:%M") - datetime.strptime(ct,"%H:%M") ## extract whatever values you want from this delta: ## eg: seconds = minus.seconds hours = minus.seconds//3600 minutes = (minus.seconds//60)%60 print(hours) print(minutes)
Utilisez l'expression régulière ci-dessous:
import re from datetime import datetime ct = datetime.now().strftime("%H:%M") time = "10:30" minus = datetime.strptime(time,"%H:%M") - datetime.strptime(ct,"%H:%M") minus = datetime.strptime(str(minus),"%H:%M:%S" "").strftime("%H:%M") #print(minus) matches = re.findall(r'([^:]+)',minus) for match in matches: print (match)
Voir l'explication regex ici: https://regex101.com/r/EgXlcD/46
'([^:]+)'
beaucoup de ce code n'a rien à voir avec l'impression heure par minute sur une ligne séparée. est-ce que
minus
partie de la question que vous voulez poser ici?Hein? Qu'avez-vous essayé jusqu'à présent et quel a été votre résultat? Si j'exécute votre script, j'obtiens une erreur car votre valeur "moins" (ligne 6) ne correspond pas à votre chaîne ("% H:% M:% S"). Le message d'erreur indique clairement que. Alors, quelle est exactement votre question ?????
j'éviterais d'utiliser regex pour cela. Il n'y a qu'une seule variante. Utilisez simplement Split