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 :

selectionner une partie d'une chaine


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Par défaut selectionner une partie d'une chaine
    Bonjour,

    Je cherche à selectionner une partie de chaine qui a cette structure:
    toto[titi].tata.tonton ou tutu.tata.tonton

    Je souhaite récupérer dans les 2 cas toto.tata.tonton et tutu.tata.tonton
    Il faut simplement qu'il supprime [titi] (qui peux etre [tonton] ou autre...)

    J'ai pensé à split mais sans succes... je ne connais pas bien python...

    Merci bcp pour votre aide

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Je ne vois que le module re

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import re
    a="toto[titi].tata.tonton"
    re.sub("\[.*\]", "", a)
    Le résultat est là

    'toto.tata.tonton'

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Par défaut
    magique...

    merci à toi. Je n'avais pas trouvé comment écrire [.*\]...

  4. #4
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Juste pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.sub("\[.*\]", "", a)
    remplace la première occurrence de n'importe quoi entre crochets par rien dans la chaîne a.
    D'une manière générale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.sub("exp", "str", a)
    remplace la première occurrence qui match l'expression régulière exp par la chaîne str dans a.
    (voir ici re.sub)

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Et n'oublie pas le Résolu

  6. #6
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Je ne vois que le module re
    En fait on peut très bien s'en sortir sans, c'est juste plus long à écrire, je pense même que ce serait plus rapide à éxécuter, mais ce n'est qu'une supposition...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> def delCrochets(txt):
    	levelOpened = 0
    	res         = ''
    	for char in txt:
    		if   char == '['                 : levelOpened += 1
    		elif char == ']' and levelOpened : levelOpened -= 1
    		elif not levelOpened             : res         += char
    		txt = txt[1:]
    	return res
     
    >>> delCrochets('toto[titi].tata.tonton')
    'toto.tata.tonton'

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    J'ai écris une fonction simple en utilisant les index et le slicing

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> def decoupe(string):
    ...     a=string.index("["); b=string.index("]")
    ...     return string[0:a]+string[b+1:len(string)]
     
     
    >>> a
    'toto[titi].tata.tonton'
    >>> decoupe(a)
    'toto.tata.tonton'
    Je pense que ça doit être plus rapide que le module re.


  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    @fred1599

    Pas mal comme réponse, j'avais à peu près la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def decoupe(chaine):
        prefix, rest = chaine.split('[')
        left, suffix = rest.split(']')
        return prefix + suffix
    Mais l'inconvénient de nos méthodes par rapport à celle de N.tox est qu'on l'a dans l'os s'il y a + d'1 paire de [] dans la chaine de caractères.
    Dans mon cas, ça plantera directement à la première ligne, dans le tien, la chaine sortie sera fausse.

    J'aurais aimé savoir si la syntaxe de la chaine à découper était déterminée.

    Et, personnellement, j'essaie de limiter au maximum l'appel au module re, qui est effectivement + lent que les méthodes natives de strings (split, index, etc.).

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Oui c'est vrai, mais dans ce cas, peut-être que le PO pourrait détaillé un peu plus son post, car je ne vois rien de stipuler dans ce sens.

  10. #10
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Tout à fait, je souffre toutefois d'une limitation : si dans la chaine il y a moins de ']' que de '[' après le premier '[', tous les caractères depuis '[' seront ignorés...

    voici une version plus sûre :
    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
    >>> txt='1[2[x]3[x[x]x][4'
    >>> def delCrochets(txt):
        res          = ''
        def isThereEnd(s):
            lvl = 0
            for i,char in enumerate(txt[s:]):
                if   char == '['         : lvl += 1
                elif char == ']' and lvl : lvl -= 1
                if not lvl : return i+1
            return 0
        while 1:
            idxs = txt.find('[')
            if idxs==-1: return res+txt
            idxe = isThereEnd(idxs)
            if idxe:
                res += txt[:idxs]
                txt  = txt[idxs+idxe:]
            else :
                idxs = txt.find('[',idxs+1)
                if idxs==-1: return res+txt
                res += txt[:idxs]
                txt  = txt[idxs:]
     
    >>> delCrochets(txt)
    '1[23[4'

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/04/2013, 15h57
  2. [RegEx] Retourner une array sur une partie de la chaine
    Par absurdsystem dans le forum Langage
    Réponses: 2
    Dernier message: 25/04/2010, 16h03
  3. Sélectionner seulement une partie d'une valeur d'une cellule
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2007, 11h05
  4. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 16h47
  5. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39

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