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 :

help les regexp !


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 18
    Par défaut
    Bonjour tout le monde!

    Je me prend la tête avec les regexp sur un truc simple...

    J'essaye de matcher un groupe entre <<<%% et %%>>>.
    Du coup j'ai ecris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>>def foo(match):
    ...    print("{}\t{}\t{}".format(match.group(0),match.group(1),match.group(2)))
    ...    return "OK!!!!!"
    ...
    >>>l__string="debut bla bla <<<%%le match goup%%>>>bli bli fin"
    >>>l__reRes = re.sub(r"(.*)<<<\%\%(\w*)\%\%>>>(.*)",foo, l__string)
    et ... rien. Je ne passe pas dans foo()
    Pourquoi tant de haine ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Je ferais ainsi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import re
     
    PATTERN = '<<<\%\%(\w*)\%\%>>>'
     
    def foo(matchobj):
        match = matchobj.group(0)
        if match == '<<<%%toto%%>>>':
            return 'TITI'
        else: return match
     
    replace = lambda s : re.sub(PATTERN, foo, s)
     
    print replace('123<<<%%tutu%%>>>xyz')
    print replace('123<<<%%toto%%>>>xyz')
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 18
    Par défaut
    Merci !
    Je peux effeectivement passer par là. L'idée fonctionnelle est (en simplifiée):
    Dans un fichier j'ai des trucs comme "Bonjour <<<%%Dest_Name%%>>>, votre courrier du <<<%%Aff_Date%%>>>..."
    Je lis la ligne du courrier et doit produire : "Bonjour M. Client, votre courrier du 12/12/12..."
    du coup je dois virer les tags d'ouverture "<<<%%" et fermeture "%%>>>" et modifiant l'intérieur. En procédant par groupes :
    - le groupe avant(.*)
    - le groupe match(\w*)
    - le groupe apres(.*)
    il me suffisait (dans foo) de retourner qqchose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    match.group(0)+dico[match.group(1)]+match.group(2)
    Cela dit, merci. Ta solution me permet d'avancer mais je ne comprend pas pourquoi la mienne ne fonctionne pas
    Son interet etant que foo n'a pas a connaitre les tags utilisés et devient générique

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    L'idée fonctionnelle est (en simplifiée):
    Dans un fichier j'ai des trucs comme "Bonjour <<<%%Dest_Name%%>>>, votre courrier du <<<%%Aff_Date%%>>>...

    Je lis la ligne du courrier et doit produire : "Bonjour M. Client, votre courrier du 12/12/12..."
    du coup je dois virer les tags d'ouverture "<<<%%" et fermeture "%%>>>" et modifiant l'intérieur
    Ci dessous je remplace les tags de la forme <<<%%TOKEN%%>>> par $(TOKEN)s, i.e. par des tags que le formatteur de chaines de caractères sait reconnaitre. Le 'texte' soumis est donc transformé en 'template'.

    => Il serait peut être astucieux de voir si vous ne pourriez pas construire vos 'tags' sous une forme 'acceptable' par un gestionnaire de template 'normal'. Ce qui éviterait de remplacer des tags par des tags.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import re
     
    PATTERN = '<<<\%\%(\w*)\%\%>>>'
    def foo(matchobj):
        token = matchobj.group(1)
        return '%%(%s)s' % token
     
    replace = lambda s : re.sub(PATTERN, foo, s)
     
    test_string = "<<<%%Dest_Name%%>>>, votre courrier du <<<%%Aff_Date%%>>>..."
    template = replace(test_string)
    Dest_Name = 'Mr.Toto'
    Aff_Date = '16 Mai 2010'
    print template % vars()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 18
    Par défaut
    En fait j'utilise deja les string template. J'ai décris mon probleme de façon simplifié (pour alléger le propos ) mais dans sa globalité je dois traiter (à l'interieur de mes tags) des expressions plus complexes qu'une simple substitution de variable. Je dois pouvoir aussi accepter un appel de fonction python.

    Mon fichier input contient :
    1 <<<%%Paris le ${Aujourdhui},%%>>>
    2 Comme convenu ...
    3 <<<%%${Dest_Name}, votre courrier du ${Aff_Date} est traité dans ...%%>>>
    4 ...
    5 et nous avons le plaisir de vous informer que les produits :
    6 <<<%%__liste_produit('${NCommand}')%%>>>
    7 vous serons livrés comme prévu.
    8 ...
    Dans les lignes 1, 3 et 6 la substition s'applique d'abord par la methode substitute de la classe Template sur la base d'un dico pour les clefs qui figurent entre {}. Cela permet de "tagger" le fichier de façon simplifié (marquage de ligne), sauf si le tag contient un appel de fonction (comme __liste_produit à la ligne 6) où là il borde l'appel.
    Du coup mon code (python 3.1) :

    Code python : 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
    21
    22
    23
    24
    25
    26
    from string import Template
     
    def __TemplateReplaceCallback(i__match):
     
        global g__TMPLVars
     
        l__tmpl = Template(i__match.group(1))
        l__buffer = l__tmpl.substitute(**g__TMPLVars)
        l__buffer = eval(l__buffer, locals(), globals())
     
        return i__match.group(0)+l__buffer+i__match.group(2);
     
     
    def instanciateTemplate(i__templateFile, i__instanceFile):
        l__regExp = "(.*)<<<\%\%(\w*)\%\%>>>(.*)"
     
        l__file_tmpl = open(i__templateFile,"r")
        if(l__file_tmpl):
            l__file_out = open(i__instanceFile,"w")
            if(l__file_out):
                l__lines = l__file_tmpl.readlines()
                for line in l__lines :
                    line = re.sub(l__regExp, __TemplateReplaceCallback, line)
                    l__file_out.write(line)
                l__file_out.close()
            l__file_tmpl.close()

    Dans la fonction __TemplateReplaceCallback "l__tmpl.substitute(**g__TMPLVars)" traite les substitution de variable et "eval(l__buffer, locals(), globals())" effectue l'appel de fonction si present.

    wouala donc pourquoi je dois traiter par regExp. Je dois faire en sorte que la fonction __TemplateReplaceCallback ne connaisse rien du tag et reste generique.

    Wouala vous savez tout !
    Donc, ma question: "Pourquoi l__regExp = "(.*)<<<\%\%(\w*)\%\%>>>(.*)" ne match pas?"

    Merci de votre aide...

  6. #6
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Salut,
    j'ai lu en diagonale, mais ça serait pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("{}\t{}\t{}".format(match.group(1),match.group(2),match.group(3)))
    que tu voudrais ?
    te renvoi l'ensemble de la chaîne matchante.

    Chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    >>> f = "123<<<%%tutu%%>>>xyz"
    >>> g = re.match(r"(.*)<<<%%(\w*)%%>>>(.*)", f)
    >>> g.group(1)
    '123'
    >>> g.group(2)
    'tutu'
    >>> g.group(3)
    'xyz'
    >>> g.group(0)
    '123<<<%%tutu%%>>>xyz'
    >>> g.group()
    '123<<<%%tutu%%>>>xyz'

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

Discussions similaires

  1. Besoin d'un coup de main avec les regexp .Net
    Par scaleo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/06/2007, 10h40
  2. Toujours Les RegExp
    Par LEK dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/05/2007, 10h04
  3. les regExp ne sont décidément pas ma tasse de thé !
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 05/12/2006, 16h14
  4. Demande d'aide sur les regexp
    Par Uld dans le forum Langage
    Réponses: 1
    Dernier message: 18/08/2006, 22h15

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