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 en python


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 33
    Points : 12
    Points
    12
    Par défaut Regex en python
    Bonjour,

    Je voudrai faire une regex pour rechercher/remplacer dynamiquement en python mais je n'y arrive pas.

    J'ai par exemple la chaine: "ceci est un test <IgnoreRegex>ceci est un test</IgnoreRegex> ceci est un test <IgnoreRegex>ceci est encore un autre test</IgnoreRegex>"

    Et je voudrai remplacé partout où il est écrit "test" par "test2" MAIS uniquement quand ce n'est pas à l'intérieur de <IgnoreRegex>...</IgnoreRegex>

    Comment faire svp ?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Si j'étais toi, je ferais ce traitement en 3 passes:
    1. Séparer ce qui doit être traité et ce qui ne doit pas l'être.
    2. Traiter ce qui doit l'être
    3. Reconstituer le tout

    Voici un exemple de code pour séparer. Il n'est pas garanti sans bug, c'est juste un... exemple.
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    In [1]: aTraiter = []
     
    In [2]: aNePasTraiter = []
     
    In [3]: lenOpen = len("<IgnoreRegex>")
     
    In [4]: lenClose = lenOpen + 1
     
    In [5]: lastIndex = 0
     
    In [6]: txt = "<IgnoreRegex>Ceci ne doit pas être traîté. Les mots qui suivent l
    e doivent: </IgnoreRegex>ces mots suivent"
     
    In [7]: pos = txt.find("<IgnoreRegex>")
     
    In [8]: while pos > -1:
       ...:     aTraiter.append(txt[lastIndex : pos])
       ...:     lastIndex = pos + lenOpen
       ...:     pos = txt.find("</IgnoreRegex>", lastIndex)
       ...:
       ...:     if pos > -1:
       ...:         aNePasTraiter.append(txt[lastIndex : pos])
       ...:         lastIndex = pos + lenClose
       ...:         pos = txt.find("<IgnoreRegex>", lastIndex)
       ...:
       ...:
     
    In [9]: aTraiter.append(txt[lastIndex:])
     
    In [10]: aTraiter
    Out[10]: ['', 'ces mots suivent']
     
    In [11]: aNePasTraiter
    Out[11]: ['Ceci ne doit pas \x88tre tra\x8ct\x82. Les mots qui suivent le doivent: ']

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 33
    Points : 12
    Points
    12
    Par défaut
    Merci pour la réponse,

    Je pense effectivement que c'est la meilleurs solution.

    Merci beaucoup.

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import re
     
    ch = "ce test ci est un test "\
         +"<IgnoreRegex>cela est un test</IgnoreRegex>"\
         +"ici encore un test comme test "\
         +"<IgnoreRegex>ceci est encore un autre test</IgnoreRegex>"
     
    pattest = '(\A|</IgnoreRegex>).*?(\Z|<IgnoreRegex>)'
    def f(m):
        return m.group().replace('test','test2')
     
    ch = re.sub(pattest,f,ch)
    print ch
    ce test2 ci est un test2 <IgnoreRegex>cela est un test</IgnoreRegex>ici encore un test2 comme test2 <IgnoreRegex>ceci est encore un autre test</IgnoreRegex>

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 33
    Points : 12
    Points
    12
    Par défaut
    Merci eyquem,

    Ca marche aussi.
    Au moins comme ça je sais maitenant comment le faire directement en regex.

  6. #6
    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
    Attention, mon code ne marche que si des balises <bal> et <\bal> alternent régulièrement.

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

Discussions similaires

  1. RegEx et Python
    Par benoxy dans le forum Général Python
    Réponses: 7
    Dernier message: 20/09/2011, 20h05
  2. [RegExp] Une regex Python en Javascript
    Par ____22 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 05/08/2011, 17h15
  3. [Python] Regex d'intro
    Par nicolo011 dans le forum Général Python
    Réponses: 4
    Dernier message: 26/01/2010, 14h30
  4. regex : différence entre Perl et Python
    Par rambc dans le forum Général Python
    Réponses: 3
    Dernier message: 08/01/2009, 20h53
  5. python et regex
    Par olaxius dans le forum Général Python
    Réponses: 2
    Dernier message: 15/11/2006, 14h02

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