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 :

re.sub et match.groups()[0]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut re.sub et match.groups()[0]
    Bonjour,

    une petite question assez subtile sur l'utilisation de re.sub :

    Je voudrais remplacer des morceaux de chaînes dépendant du contexte (caractères autour du motif à remplacer) sans altérer ce contexte.

    Un exemple (complètement bidon, juste pour illustrer) :

    Je veux remplacer les caractères uniques placés entre 2 lettres par '*'.
    Ma chaîne : '---asd---j7k---t$u---r&&u---'
    Ce que je veux obtenir : '---a*d---j*k---t*u---r&&u---'

    J'essaye en utilisant re.sub :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import re
    ex = re.compile('[a-z](.)[a-z]')
    def repl ( match ):
        print match.groups()[0]
        return '*'
    s1 = '---asd---j7k---t$u---r&&u---'
    s2 = ex.sub( repl,s1 )
    print s2
    Mais j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    s
    7
    $
    ---*---*---*---r&&u---
    On voit que match.groups()[0] contient bien ce qu'il faut, mais les lettres qui entourent le caractère à remplacer sont remplacées avec !

    Comment dire à re.sub que je ne veux remplacer que match.groups()[0] ?

    Merci d'avance !

  2. #2
    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,

    C'est normal: tu lui demandes de trouver "asd" et de le remplacer par "*", et c'est ce qu'il fait!

    Il faut donc dire dans le motif de remplacement qu'il doit AUSSI renvoyer la 1ère et la 3e lettre trouvées.

    Pour cela, il faut mettre en parenthèse la 1ère et la 3e lettre du motif de recherche pour les retrouver en tant que group et pouvoir les placer dans le motif de remplacement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import re
     
    def repl(match):
        return match.groups()[0] + "*" + match.groups()[2]
     
    s = '---asd---j7k---t$u---r&&u---'
    motif = "([a-z])(.)([a-z])"
     
    print re.sub(motif, repl, s)
    ---a*d---j*k---t*u---r&&u---

  3. #3
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Arf !
    bien sûr...
    comment n'y ai-je pas pensé

    Merci

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Hello,

    Il est possible de réinjecter directement les sous groupes dans le masque de remplacement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    re.sub('([a-z])(.)([a-z])', '\\1*\\3', s)

  5. #5
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Merci du tuyau, mais dans mon vrai code, j'ai traitement à faire sur la chaîne de remplacement.

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

Discussions similaires

  1. [REGEX] Comment extraire les named groups avant le match ?
    Par vmolines dans le forum Framework .NET
    Réponses: 0
    Dernier message: 08/07/2011, 10h26
  2. Réponses: 4
    Dernier message: 19/12/2009, 22h46
  3. [RaveReport] - Bloquer groupe sur une page
    Par muaddib dans le forum Rave
    Réponses: 3
    Dernier message: 25/02/2003, 16h21
  4. gestion des groupes
    Par muaddib dans le forum QuickReport
    Réponses: 3
    Dernier message: 31/12/2002, 11h01

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