1. #1
    Membre du Club
    Inscrit en
    mars 2006
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 202
    Points : 52
    Points
    52

    Par défaut Isoler une chaine entre crochets

    Bonjour,

    je dispose d'un fichier composé de deux champs
    code nom
    1 [Caryophyllia smithii] and [Pentapora foliacea] sponges with
    2 [Caryophyllia smithii], sponges
    3 Talitrids on the upper shore and strandline (partie)

    mon but est d'obtenir ceci
    code nom
    1 Caryophyllia smithii
    1 Pentapora foliacea
    2 Caryophyllia smithii...

    j'ai essayé d'utiliser les regex
    re.search ("(\[.*\]+)",chaine).group(0) pour isoler les chaines entre crochet mais cela ne prend que la premiere chaine entre crochet .
    De plus cela bug si j'ai une chaine qui n'a pas de crochet ou plus de une chaine entre crochet?
    bref
    merci de votre aide

    j'ai en partie trouver une solution en modifiant mon regex
    re.search ("(\[.*\]+)*",chaine).group(0)

    j'avais oublié une * mis cela garde quand même ce qu'il y a entre chaque chaine ex:[Caryophyllia smithii] and [Pentapora foliacea]
    Pour le reste je continue à chercher, si quelqu un a une idée ou une amélioration je suis preneur

  2. #2
    Expert Confirmé Sénior
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    2 612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 612
    Points : 4 874
    Points
    4 874
    Billets dans le blog
    6

    Par défaut

    Bonjour,

    Il faut utiliser findall, et modifier le motif. Le motif actuel trouve le 1er '[' et le dernier ']' ce qui ne convient pas à la 1ère ligne.

    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
     
    liste = ["[Caryophyllia smithii] and sponges with [Pentapora foliacea]",
             "[Caryophyllia smithii], sponges",
             "Talitrids on the upper shore and strandline (partie)"
            ]
     
    for i, ligne in enumerate(liste):
        print i, re.findall(r"\[([^\]]*)\]*", ligne)
     
    0 ['Caryophyllia smithii', 'Pentapora foliacea']
    1 ['Caryophyllia smithii']
    2 []
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre du Club
    Inscrit en
    mars 2006
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 202
    Points : 52
    Points
    52

    Par défaut

    ok merci tyrtamos

    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
     
    import re
    import xlrd
    # ouverture du fichier Excel 
    wb = xlrd.open_workbook('typoesp.xls')
     
    fichier=[]
     
    # lecture des données dans la première feuille
    sh = wb.sheet_by_name(u'Feuil1')
     
    colonne1 = sh.col_values(0)
    colonne2 = sh.col_values(1)
     
     
     
    for i,rows in enumerate (colonne2):
     
        print i,re.findall(r"\[([^\]]*)\]*",rows)
    je pensais insérer un .split(',') sur colonne2 pour isoler chaque chaine mais j'ai cette erreur 'list' object has no attribute 'split'

    comment je peux arriver à avoir ce resultat?

    1 Caryophyllia smithii
    1 Pentapora foliacea
    2 Caryophyllia smithii...

  4. #4
    Expert Confirmé Sénior
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    2 612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 612
    Points : 4 874
    Points
    4 874
    Billets dans le blog
    6

    Par défaut

    Comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i, ligne in enumerate(liste):
        for ch in re.findall(r"\[([^\]]*)\]*", ligne):
            print i+1, ch
    1 Caryophyllia smithii
    1 Pentapora foliacea
    2 Caryophyllia smithii
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre du Club
    Inscrit en
    mars 2006
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 202
    Points : 52
    Points
    52

    Par défaut

    re,

    trop fort

    merci pour l'aide

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

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