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 :

Regex avec mots atachés [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Compositing / Pipeline
    Inscrit en
    Novembre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Compositing / Pipeline
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2011
    Messages : 63
    Par défaut Regex avec mots atachés
    Bonjour,

    J'ai fait un petit script qui va chercher les fichiers dans un dossier, puis les reclasses afin de pouvoir les éditer dans une applications tierces.
    Je suis confronter à un problème, me mettre à la place d'un utilisateur
    Je me suis dit qu'il fallait alors passer par du regex afin d'élargir les possibles erreurs de frappes.

    Exemple de fichiers dans un dossier ayant différentes nomenclature:

    RndRawGlobalIllumination.0001.png
    RndGlobalIllumination.0001.png
    Rnd Global Illumination.0001.png
    RawGlobalIllumination.0001.png
    Raw_Global_Illum.0001.png
    RndGlobalIllum.0001.png
    GlobalIllumination.0001.png
    Global_Illumination.0001.png
    RawGI.0001.png
    GI.0001.png
    SelfIllumination.0001.png
    RndRawLighting.0001.png

    Pour les trier en :

    RndRawGlobalIllumination.0001.png
    RndGlobalIllumination.0001.png
    Rnd Global Illumination.0001.png
    RawGlobalIllumination.0001.png
    Raw_Global_Illum.0001.png
    RndGlobalIllum.0001.png
    GlobalIllumination.0001.png
    Global_Illumination.0001.png
    RawGI.0001.png
    GI.0001.png
    SelfIllumination.0001.png
    RndRawLighting.0001.png


    Se que j'aimerai récupérer, se sont les fichiers ayant que pour nomenclature : "GlobalIllumination", "GI" et/ou "GlobalIllum"

    J'ai essayé de faire quelques chose :
    re.compile(r"[globalGLOBAL]{6}.?[illuminationILLUMINATION]{12}|[GIgi]{2}|[illumILLUM]{5}")

    Le problème, c'est qu'il me sélectionne aussi d'autre fichiers qui comporte des "ig" "illum" mais surtout je n'arrive pas à la contraindre sur les préfixes ou suffixes.
    Je tourne en rond sur https://regexr.com/...

    Si quelqu’un passe par là..


    merci

  2. #2
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut,

    Faire [globalGLOBAL]{6} revient à dire de autoriser 6 caractères parmi globalGLOBAL, donc on peut se retrouver avec des GGGGGG, etc, pas nécessairement global ou GLOBAL, pour cela, il faut utiliser des parenthèses.

    Ton expression devrait en gros ressembler à ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exp = '^((?:Rnd ?)?Global(?:_| )?Illum(?:ination)?|GI)\.\d{4}\.png$'

  3. #3
    Membre confirmé
    Homme Profil pro
    Compositing / Pipeline
    Inscrit en
    Novembre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Compositing / Pipeline
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2011
    Messages : 63
    Par défaut
    fiou, ok...complétement à coté.

    J'essaie de décortiquer tous ça, mais j'ai du mal à comprendre l'utilisation des parenthèses et du "?:"

    En gros tu décompose ça par groupe de mot (d’où les parenthèses), puis tu demande si ça correspond (avec "?:") et si ça ne correspond pas tu passe au mot suivant avec "|", c'est ça ?
    Si tu as le temps de m’expliquer, ça m'aiderai à comprendre.

    merci en tout cas.

  4. #4
    Membre confirmé
    Homme Profil pro
    Compositing / Pipeline
    Inscrit en
    Novembre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Compositing / Pipeline
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2011
    Messages : 63
    Par défaut
    Je pense avoir capter le truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '((?<![rR][aA][wW])([gG][lL][oO][bB][aA][lL])(?:_| )?([iI][lL][lL][uU][mM])(?:[iI][nN][aA][tT][iI][oO][nN])?|[gG][iI])'
    C'est long et relou, mais au moins si une lettre est mis en capital...on est bon.

    il ne me reste plus qu'à trouver pour :
    RawGI.0001.png
    GI.0001.png

    Afin de ne garder que GI

  5. #5
    Membre confirmé
    Homme Profil pro
    Compositing / Pipeline
    Inscrit en
    Novembre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Compositing / Pipeline
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2011
    Messages : 63
    Par défaut
    Ha bhé voila, suffit de répéter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '((?<![rR][aA][wW])([gG][lL][oO][bB][aA][lL])(?:_| )?([iI][lL][lL][uU][mM])(?:[iI][nN][aA][tT][iI][oO][nN])?|(?<![rR][aA][wW])[gG][iI])'
    Si tu repasse par là, dit moi se que tu en pense ?!

    merci

  6. #6
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Miaz3 Voir le message
    fiou, ok...complétement à coté.

    J'essaie de décortiquer tous ça, mais j'ai du mal à comprendre l'utilisation des parenthèses et du "?:"

    En gros tu décompose ça par groupe de mot (d’où les parenthèses), puis tu demande si ça correspond (avec "?:") et si ça ne correspond pas tu passe au mot suivant avec "|", c'est ça ?
    Si tu as le temps de m’expliquer, ça m'aiderai à comprendre.

    merci en tout cas.
    Non, par défaut les parenthèses d'une expression régulière sont capturantes, or ici cela n'est nullement utile de capturer ces portions de texte comme Rnd, _, l'espace, etc.
    Les métas caractères successifs ?: spécifie que l'on souhaite ne pas capturer ces éléments.
    C'est spécifié dans la doc re de python

    L'expression à l'air complexe au 1er abord, mais en fait elle est très simple.

    '^((?:Rnd ?)?Global(?:_| )?Illum(?:ination)?|GI)\.\d{4}\.png$'

    (?:Rnd ?)? signifie donc une parenthèse non capturante => (?: optionnelle => )? contenant Rnd suivi optionnellement d'un espace.

    (?:_| )? parenthèse non capturante optionnelle contenant soit un underscore OU soit un espace, le « ou » étant donc le pipe |

    Illum(?:ination)? Illum suivi opyionnellement d'une parenthèse non capturante optionnelle contenant ination.

    ...|GI signifie donc la chaine contenant une chaine avec Global ou la chaine GI.

    Pour le reste je pense que tu dois connaître.

    Par ailleurs, si tu n'as pas besoin non plus de récupérer uniquement le nom de l'image, tu peux également utiliser une parenthèse non capturante (ie : (??:Rnd... au lieu de ((?:Rnd... )

    Pour tes expressions, j'ai pas compris ce que tu souhaites faire, car normalement l'expression que je t'ai mis répondait au besoin de ton 1er message.

    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
    20
    import re
     
    fichiers = """RndRawGlobalIllumination.0001.png
    RndGlobalIllumination.0001.png
    Rnd Global Illumination.0001.png
    RawGlobalIllumination.0001.png
    Raw_Global_Illum.0001.png
    RndGlobalIllum.0001.png
    GlobalIllumination.0001.png
    Global_Illumination.0001.png
    RawGI.0001.png
    GI.0001.png
    SelfIllumination.0001.png
    RndRawLighting.0001.png"""
     
    exp = '^(?:(?:Rnd ?)?Global(?:_| )?Illum(?:ination)?|GI)\.\d{4}\.png'
    for fichier in fichiers.splitlines() :
        m = re.match(exp, fichier)
        if m :
            print(m.group())

  7. #7
    Membre confirmé
    Homme Profil pro
    Compositing / Pipeline
    Inscrit en
    Novembre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Compositing / Pipeline
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2011
    Messages : 63
    Par défaut
    Merci pour toutes ces explications !

    Avec ce que tu as proposé plus haut, j'ai fait le test sur https://regex101.com/ et ça ne m'affichait rien.
    Effectivement j'aurai du simplement essayer ça directement dans une console python...

    Concernant les lignes plus haut, j'essaie de prévoir si les textes seront en majuscule ou non. d’où les "...[gG][lL][oO][bB][aA][lL]..."
    Et puis concernant "(?<![rR][aA][wW])" j'ai vu sur la doc python que ça permettait d’esquiver se qu'il y avait avant.

    Je vois que j'ai mélangé pas mal de choses...mais je ne comprend toujours pas pourquoi sur regex101.com ça ne fonctionne pas.
    Je trouvai ça pratique comme site.

  8. #8
    Membre confirmé
    Homme Profil pro
    Compositing / Pipeline
    Inscrit en
    Novembre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Compositing / Pipeline
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2011
    Messages : 63
    Par défaut
    (?:Rnd ?)? signifie donc une parenthèse non capturante => (?: optionnelle => )? contenant Rnd suivi optionnellement d'un espace.
    Je pensais dans le cas ou je ne sais pas se qu'il peut y avoir avant "GlobalIllumination" ? mais qu'il capte toujours "GlobalIllumination"

    exemple :
    RndGlobalIllumination
    NoneGlobalIllumination
    NadaGlobalIllumination

    Ou alors s'il détecte "nada" il ne la retient pas.

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

Discussions similaires

  1. Les regex avec des mots composés
    Par Halex78 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/07/2008, 00h26
  2. Problème de Regex ... avec un point
    Par bugalood dans le forum Langage
    Réponses: 2
    Dernier message: 29/05/2005, 10h26
  3. acceder a un fichier avec mot de passe
    Par moa378 dans le forum Windows
    Réponses: 16
    Dernier message: 17/05/2005, 12h15
  4. [VB.NET] Fichier Excel vérouillé avec mot de passe
    Par rafano dans le forum ASP.NET
    Réponses: 2
    Dernier message: 10/06/2004, 14h36
  5. [jakarta][regex]Matcher mot en entier.
    Par thibaut dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 26/05/2004, 13h33

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