IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Encore une question sur les expression régulières [Python 3.X]


Sujet :

Python

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 250
    Points : 259
    Points
    259
    Par défaut Encore une question sur les expression régulières
    Bonjour,

    J'utilise de temps en temps les expressions régulières, avec bien du mal parfois. Aujourd'hui, je cherche à calculer le nombre de secondes à partir de chaînes de ce genre là : "1h01min59s", "42min01s", "12s".

    Pour le premier exemple avec heure, minute, seconde, j'ai trouvé celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m = re.match(r"^(?P<hours>\d+)h(?P<minutes>\d+)min(?P<seconds>\d+)s$", "1h01min59s")
    Le souci est que je voudrais faire un truc élégant et utiliser la même expression régulière pour tester les 3 exemples cités, plutôt que de tester chaque exemple avec 3 expressions régulières différentes. Mais je sèche un peu. Auriez-vous des idées ?

    Merci d'avance

    J'utilise Python 3.6

  2. #2
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    m = re.match(r"^(?:(?:([01]?\d|2[0-3])h)?([0-5]?\d)min)?([0-5]?\d)s$", "7h34min12s")
    hours, minutes, seconds = m.groups()
    print(seconds)
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans la mesure où on veut seulement extraire les secondes, et que celles-ci sont les 2 chiffres qui précèdent le 's', je préfère utiliser "re.search":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import re
     
    ch = "1h01min59s"
    regex = re.search(r"([0-9]{2})s", ch)
    if regex!=None:
        print(regex.group(1))
    Ce qui donnera (ce sont les caractères désignés par les parenthèses dans le motif):

    Le résultat est une chaine qu'il faudra convertir en entier si c'est utile.

    S'il y avait plusieurs horaires dans la chaine et qu'on voulait obtenir toutes les secondes, il faudrait plutôt utiliser "re.findall":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ch = "1h01min57s 1h01min58s 1h01min59s"
    regex = re.findall(r"([0-9]{2})s", ch)
    if regex!=None:
        print(regex)
    Ce qui donnera:

    Enfin, si l'horaire peut désigner les secondes avec "S" et "s" selon le cas, on peut utiliser un drapeau comme "re.IGNORECASE" comme 3ème argument.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Le souci est que je voudrais faire un truc élégant et utiliser la même expression régulière pour tester les 3 exemples cités, plutôt que de tester chaque exemple avec 3 expressions régulières différentes. Mais je sèche un peu. Auriez-vous des idées ?
    Simplement faites chaque group optionnel, comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import re
    def work(p,s):
        m = p.match(s)
        if (m):
            print('hours:', m.group('hours'))
            print('minutes:', m.group('minutes'))
            print('seconds:',m.group('seconds'))
        else:
            print('no match')
     
    p=re.compile(r"^((?P<hours>\d+)h)?((?P<minutes>\d+)min)?((?P<seconds>\d+)s)?$")
    s="1h01min59s"
    work(p,s)
    s="1min59s"
    work(p,s)
    s="59s"
    work(p,s)
    s="xyz"
    work(p,s)
    S'améliorer est sans fin, d'ailleurs.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Dans la mesure où on veut seulement extraire les secondes, et que celles-ci sont les 2 chiffres qui précèdent le 's', je préfère utiliser "re.search"
    Un expression régulière est utile pour valider que la chaine de caractères est bien construite avant d'en extraire ce qu'on veut.

    Si on sait qu'elle est bien formée (ou qu'on n'a pas envie de le vérifier) extraire les 2 avant derniers caractères se fait très bien et facilement sans expressions régulières.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 250
    Points : 259
    Points
    259
    Par défaut
    Citation Envoyé par tsuji Voir le message
    Simplement faites chaque group optionnel, comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p=re.compile(r"^((?P<hours>\d+)h)?((?P<minutes>\d+)min)?((?P<seconds>\d+)s)?$")
    Merci beaucoup. C'est exactement ce que je cherchais. Je ne savais pas qu'on pouvait rendre ces groupes optionnels... jusqu'à aujourd'hui

    Merci également aux autres pour leur réponse

  7. #7
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    En relisant le sujet, c'est vrai qu'on ne sait pas vraiment pourquoi l'utilisation d'une expression régulière est absolument nécessaire. Car elle a un coût d'execution non négligeable, ne serait-ce que pour construire l'automate à états finis.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    time = "12h45min08s"
    seconds = time[-3:-1]

    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par Hephaistos007
    c'est vrai qu'on ne sait pas vraiment pourquoi l'utilisation d'une expression régulière est absolument nécessaire.
    Je crois qu'il cherche à récupérer aussi bien les heures et les minutes que les secondes de manière à tout convertir en secondes, d'où l'emploi du terme "calculer" dans son message initial.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [grep] Une question sur les expressions régulières
    Par Bahan_auboulot dans le forum Linux
    Réponses: 5
    Dernier message: 04/12/2008, 19h12
  2. Encore une question sur les références
    Par bouba dans le forum C++
    Réponses: 7
    Dernier message: 19/02/2007, 14h16
  3. Question sur les expressions régulières
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 05/07/2006, 08h59
  4. Encore une question sur les Sous-Forums
    Par Swoög dans le forum Evolutions du club
    Réponses: 12
    Dernier message: 27/05/2006, 02h17
  5. Encore une question sur les ListBox !!
    Par SebRs dans le forum Windows
    Réponses: 3
    Dernier message: 09/05/2006, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo