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 :

Nettoyer des espaces avec des regex


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut Nettoyer des espaces avec des regex
    Bonjour,
    je voudrais passer de "bla bla 34 5 6 78 9 0 bla bla" à "bla bla 34567890 bla bla".

    Toute info. est la bienvenue.

  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,

    Ce n'est peut-être pas très subtil, mais ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import re
     
    def remplace(matchobj):
        return matchobj.group(1)
     
    ch = "bla bla 34 5 6 78 9 0 bla bla"
    res = re.sub(r"([0-9]) (?=[0-9])", remplace, ch)
     
    print res
    bla bla 34567890 bla bla
    Le principe n'est pas très compliqué:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ([0-9])     <== un chiffre
                  <== un espace
    (?=[0-9])  <== un chiffre mais ne "consomme pas" un caractère de recherche
    Si on oublie le (?=), la recherche avance d'un caractère de plus, et comme elle se fait sans recouvrement, l'espace après le '5' est ignoré.

    La fonction remplace() construit la chaine de remplacement à partie du 1er groupe trouvé qui est le seul 1er caractère du motif (c'est pour trouver ce groupe qu'il est entre parenthèses).

    Tyrtamos

  3. #3
    Membre Expert
    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
    Par défaut
    S’il y a plusieurs blancs entre les chiffres, ta regex ne marche pas, tyrtamos. Il faut ajouter une étoile après le blanc dans ta RE.

    Mais rambc n’a pas précisé s’il peut y avoir plusieurs blancs entre les chiffres. Si ce n’est pas le cas, il ne faut pas ajouter une étoile.



    En tous cas, ta méthode de traitement des blancs inter-chiffres les uns après les autres est plus longue qu’une méthode basée sur le traitement des chaînes de chiffres matchantes d’un seul coup.


    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    import re
    from time import clock
     
    ch = '''jhgjhgasd 563 6 4765 7hhdhgfgf 6757 7 4 34lklkkdf
    hghg 564 75 8 lkiurr  sss 4 4 5 3   2 34 lkjhfyyt
    poiu 75 6 ljhf 8d89 34h5t 673 dj47  478 3  222    390 nytir'''
     
    te = clock()
    for i in xrange(10000):
        # methode replace sur chaines matchantes
        ch = re.sub('\d[\d ]*\d',lambda m: m.group().replace(' ',''),ch)
    tf = clock()
    print '- methode replace sur chaines matchantes  \n',tf - te,'secondes'
    print ch
     
     
     
     
    ch = '''jhgjhgasd 563 6 4765 7hhdhgfgf 6757 7 4 34lklkkdf
    hghg 564 75 8 lkiurr  sss 4 4 5 3   2 34 lkjhfyyt
    poiu 75 6 ljhf 8d89 34h5t 673 dj47  478 3  222    390 nytir'''
     
    te = clock()
    for i in xrange(10000):
        # methode tyrtamos
        res = re.sub(r"([0-9]) (?=[0-9])", lambda m: m.group(1), ch)
    tf = clock()
    print '\n- methode tyrtamos  \n',tf - te,'secondes'
    print res
     
     
     
     
     
     
    ch = '''jhgjhgasd 563 6 4765 7hhdhgfgf 6757 7 4 34lklkkdf
    hghg 564 75 8 lkiurr  sss 4 4 5 3   2 34 lkjhfyyt
    poiu 75 6 ljhf 8d89 34h5t 673 dj47  478 3  222    390 nytir'''''
     
    te = clock()
    for i in xrange(10000):
        # methode tyrtamos avec etoile ajoutee dans la RE
        res = re.sub(r"([0-9]) *(?=[0-9])", lambda m: m.group(1), ch)
    tf = clock()
    print '\n- methode tyrtamos avec etoile ajoutee dans la RE  \n',tf - te,'secondes'
    print res

    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
    - methode replace sur chaines matchantes  
    1.87107579315 secondes
    jhgjhgasd 563647657hhdhgfgf 67577434lklkkdf
    hghg 564758 lkiurr  sss 4453234 lkjhfyyt
    poiu 756 ljhf 8d8934h5t 673 dj474783222390 nytir
    
    - methode tyrtamos  
    2.59343184678 secondes
    jhgjhgasd 563647657hhdhgfgf 67577434lklkkdf
    hghg 564758 lkiurr  sss 4453   234 lkjhfyyt
    poiu 756 ljhf 8d8934h5t 673 dj47  4783  222    390 nytir
    
    - methode tyrtamos avec etoile ajoutee dans la RE  
    5.32312123468 secondes
    jhgjhgasd 563647657hhdhgfgf 67577434lklkkdf
    hghg 564758 lkiurr  sss 4453234 lkjhfyyt
    poiu 756 ljhf 8d8934h5t 673 dj474783222390 nytir

  4. #4
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Merci. La 1ère méthode me convient.

    Citation Envoyé par eyquem Voir le message
    rambc n’a pas précisé s’il peut y avoir plusieurs blancs entre les chiffres.
    Ce n'est pas mon genre du tout... Effectivement il peut y avoir plusieurs espaces.

    Il me reste une dernière chose à faire, à savoir ajouter un espace entre un chiffre et une lettre pour au final passer de "abcde bjhjhgjg12345 7899900 dghdgsv 9000kjhskjhjq" à "abcde bjhjhgjg 123457899900 dghdgsv 9000 kjhskjhjq".

    Je pourrais alors finaliser un petit script qui permet passer d'un nombre écrit, comme "deux cents trois", à sa traduction en chiffre, soit "203" avec mon exemple.

  5. #5
    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
    Effectivement, je n'avais pas pensé à lambda (merci eyquem!), ce qui permet d'éliminer la fonction remplace().

    Mon expression se simplifie alors. J'y ai ajouté le traitement de plusieurs espaces (avec un '+' et pas un '*'):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    res = re.sub(r"([0-9])[ ]+(?=[0-9])", lambda m: m.group(1), ch)
    Il est possible que je rattrape ainsi une partie du temps.

    Je n'ai pas encore vu la suite.

    Tyrtamos

  6. #6
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Pour la deuxième fonctionnalité, le code suivant semble faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #! /usr/bin/env python
     
    import re
     
    text = 'abcde bjhjhgjg12345   7899900   dghdgsv  9000kjhskjhjq'
     
    def myRemplaceFunction(match):
        textFound = match.group()
        if textFound[0] != ' ' and textFound[1] != ' ':
            textFound = textFound[0] + ' ' + textFound[1]
        return textFound
     
    print(re.sub('((\d\D)|(\D\d))', myRemplaceFunction, text))

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

Discussions similaires

  1. [RegEx] Trouver des mots entre des mots avec le Regex seulement
    Par mutkas10 dans le forum Langage
    Réponses: 3
    Dernier message: 16/01/2013, 10h48
  2. Réponses: 1
    Dernier message: 19/08/2009, 13h19
  3. Afficher des images avec des espaces dans le nom
    Par Space Cowboy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 15/03/2007, 07h18
  4. Réponses: 3
    Dernier message: 23/01/2007, 08h14
  5. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45

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