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 :

Une expression régulière utile


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 21
    Points : 13
    Points
    13
    Par défaut Une expression régulière utile
    Bonjour à tous,

    Voilà mon petit souci, j'ai déjà utilisé des expressions régulière pour vérifier une string mais je n'arrive pas à extraire une sous-chaîne d'une chaîne initiale...

    J'ai quelque-chose du type :
    "/home/user/.qgis/python/plugins/MeP/Apercu/nom_image_Portrait.png"
    "/home/user/.qgis/python/plugins/MeP/Apercu/nom_image_Paysage.png"
    "/home/user/.qgis/python/plugins/MeP/Apercu/nom_image2_Paysage.png"

    et là je veux extraire uniquement le "nom_image" (qui est de taille variable), je parviens à le faire avec trois fonctions split() à la suite mais je suis persuadé qu'il y a beaucoup plus élégant et surtout plus rapide....

    Je n'ai pas compris toute la doc que j'ai lu donc si quelqu'un peut m'informer, toutes les idées sont les bienvenues !

    Merci d'avance!

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import re
    pattern = re.compile(r'(?:.*/)?(\w+?)_(?:Portrait|Paysage)\.png')
    pattern.match("/home/user/.qgis/python/plugins/MeP/Apercu/nom_image_Portrait.png").groups()
    >>> ('nom_image',)
    pattern.match("/home/user/.qgis/python/plugins/MeP/Apercu/nom_image_Paysage.png").groups()
    >>> ('nom_image',)

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Ou sans utiliser les expressions régulières

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> ch="/home/user/.qgis/python/plugins/MeP/Apercu/nom_image_Portrait.png"
    >>> import re
    >>> for i in ch.split('/'):
    	if i.endswith('png') and ('Portrait' in i or 'Paysage' in i):
    		print i
     
     
    nom_image_Portrait.png
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Merci kango

    Je vois à peu près ce que signifie cette expression mais
    par contre je ne comprends pas comment est extrait uniquement le nom...

    Si tu as encore une minute à me consacrer...

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    c'est extrait grâce aux groupes. un groupe est entouré de parenthèses:

    j'ai utilisé des groupes non-capturant pour les infos que l'on a pas besoin de conserver:

    ici, le nom que tu souhaites extraire est capturé par:


  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Merci bien, c'est cette histoire de groupe capturant que je ne connaissais pas !

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    et pourquoi pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for x in ("/home/user/.qgis/python/plugins/MeP/Apercu/gagarigou_Portrait.png",
              "/home/user/.qgis/python/plugins/MeP/Apercu/LOUIS XIV_Paysage.png",
              "/home/user/.qgis/python/plugins/MeP/Apercu/aujourd'hui_Paysage.png"):
        print x[x.rfind('/')+1 : x.rfind('_P')]

  8. #8
    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
    Salut
    Si on chipote un peu j'aime bien la solution de kango mais comme je travaille un peu sur OSX, un peu sur XP,... quand je vois des choses de la forme:
    "/home/user/.qgis/python/plugins/MeP/Apercu/gagarigou_Portrait.png"
    Je n'arrive pas à me sortir de la tête que c'est un nom de fichier complet avec deux composantes: chemin et nom qui pourront avoir des subtilités différentes dans chaque environnement.
    Et comme os.path.split fait déjà cela très bien, il n'y a qu'à limiter l'application du regexp au "nom".
    Ce qui donne:
    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
    import os
    import re
     
    rg = re.compile(r'(\w+?)_(?:Portrait|Paysage)\.png')
    get_name = lambda fullname: rg.match(os.path.split(fullname)[1]).groups()[0]
     
    # voila pour le code, testons un peu:
    if __name__ == '__main__':
        test_data = [
            "/home/user/.qgis/python/plugins/MeP/Apercu/nom_image_Portrait.png",
            "/home/user/.qgis/python/plugins/MeP/Apercu/nom_image_Paysage.png",
            "/home/user/.qgis/python/plugins/MeP/Apercu/nom_image2_Paysage.png",
            ]
     
        for d in test_data:
            print get_name(d)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    J’écrirais plutôt (.+? au lieu de \w+? , et avec le P sorti du groupe)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rg = re.compile(r'(.+?)_P(?:ortrait|aysage)\.png')


    Sinon il n’y a pas de match sur

    "/home/user/.qgis/python/plugins/MeP/Apercu/aujourd'hui_Paysage.png"

    et

    "/home/user/.qgis/python/plugins/MeP/Apercu/Lady G@g@_Paysage.png"

  10. #10
    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
    Bravo Eyquem,
    Tu soulèves une question intéressante...
    Lorsqu'on lit:
    J'ai quelque-chose du type :
    "/home/user/.qgis/python/plugins/MeP/Apercu/nom_image_Portrait.png"
    "/home/user/.qgis/python/plugins/MeP/Apercu/nom_image_Paysage.png"
    "/home/user/.qgis/python/plugins/MeP/Apercu/nom_image2_Paysage.png"
    Ce sont des exemples de... ce que peut être l'entrée de la fonction mais dès qu'on élargit le contexte à (chemin, nom) de fichiers vérifiant une propriété lambda... on se retrouve avec l'encoding des noms de fichiers (est ce qu'on récupère une suite de bytes ascii ou utf-8 ou latin-1 ou... de l'unicode?) et des complications sur le sens de "nom se terminant par '_Portrait.png' ou '_Paysage.png'".
    Et des bouts de code qui fonctionnent sur des exemples mais pas forcément dans le cas général...
    - 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. [EXP] Evaluation dans une expression régulière
    Par SergentHeinz dans le forum Langage
    Réponses: 7
    Dernier message: 10/11/2005, 18h17
  2. Une expression réguliére
    Par BRAUKRIS dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/09/2005, 20h14
  3. Réponses: 6
    Dernier message: 17/08/2005, 12h38
  4. Problème sur une expression régulière
    Par Verbal-Quint dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2004, 10h54
  5. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22

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