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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 250
    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
    Membre Expert
    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
    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 confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    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.

  4. #4
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    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
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 250
    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

  6. #6
    Membre Expert
    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
    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

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    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

+ 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