-1
votes

Comment séparer les chaînes en utilisant regex?

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 commentaires

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


3 Réponses :


0
votes

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"


0 commentaires

1
votes

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)


0 commentaires

0
votes

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

'([^:]+)'


0 commentaires