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 sur élément changeant


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 61
    Par défaut Regex sur élément changeant
    Bonjour à tous,

    J'ai le fichier suivant :

    # NCBI taxid / refseq / STRING
    9606 NP_001166366|NP_001166367|NP_001166368|NP_001744 9606.ENSP00000339191
    9606 NP_004496|XP_005256902 9606.ENSP00000460380
    9606 NP_004445 9606.ENSP00000306894
    9606 NP_005599 9606.ENSP00000325589
    9606 NP_001001557 9606.ENSP00000287020
    9606 NP_001124506|NP_001180247|NP_919420|XP_005272332|XP_006713941 9606.ENSP00000389709
    9606 NP_950248 9606.ENSP00000247219
    9606 NP_001273572|NP_057026|XP_005250983|XP_005250984|XP_006716631|XP_006716632|XP_006716633 9606.ENSP00000287025
    9606 NP_775746 9606.ENSP00000319482
    9606 NP_004789 9606.ENSP00000364864

    et le script suivant :

    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
     
    from collections import defaultdict
    import re
    Dtraduction=defaultdict(set)
     
    with open ("C:/Users/lveillat/Desktop/Données stage/Données/RefSeq to STRING.tsv","r") as f1:
    	for lignes in f1:
    		lignes1=lignes.rstrip("\n").replace("|"," ")
    		matchs=re.search("^(\d+)	(([A-Z]+_\d+| )+)	(\S+)", lignes1)
     
    		if matchs:
    			NCBItaxid=matchs.group(1)
    			refseq=matchs.group(2)
    			STRING=matchs.group(3)
    			Dtraduction[STRING].add(refseq)
    			print (Dtraduction)
    Mon objectif est de créer le dictionnaire Dtraduction sous cette forme :

    '9606.ENSP00000339191': {'NP_001166366', 'NP_001166367', 'NP_001166368', 'NP_001744'}})
    '9606.ENSP00000460380': {'NP_004496', 'XP_005256902'}
    '9606.ENSP00000306894' : {'NP_004445'}
    ect…

    Le soucis que j'ai, c'est que j'arrive pas a créer ma regex de façon à ce qu'elle s'adapte au nombre changeant de 'NP_xxxxx' la seule sortie que j'obtiens avec mon script est celui-ci :

    defaultdict(<class 'set'>, {'NP_001744': {'NP_001166366 NP_001166367 NP_001166368 NP_001744'}})
    defaultdict(<class 'set'>, {'NP_001744': {'NP_001166366 NP_001166367 NP_001166368 NP_001744'}, 'XP_005256902': {'NP_004496 XP_005256902'}})
    defaultdict(<class 'set'>, {'NP_001744': {'NP_001166366 NP_001166367 NP_001166368 NP_001744'}, 'XP_005256902': {'NP_004496 XP_005256902'}, 'NP_004445': {'NP_004445'}})

    Comme vous pouvez le constater il ne me prends pas les différents NP_xxxx comme différents éléments, mais comme un seul…

    Pouvez vous m'aider svp ?

    Merci

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    D'abord, c'est un code python. Donc la question devrait être poser au forum python (ici, c'est de php)
    https://www.developpez.net/forums/f1...eneral-python/

    Mais l'éssentiel c'est d'obtenir d'aide, n'est-ce pas? Voilà...

    [1] Il faut apprendre comment compter les indices de groupement. En gros, de gauche à droite chaque fois rencontrer un (, l'indice augmente par 1. Pour le détail plus précis, il vaut mieux lire des tutos et documentation.
    [2] Il vaut mieux laisser "|" comme tel pour l'étape de matcher pour ne pas laisser aucune chance de confondre les data NP_... avec la clé éventuelle 9606...

    Voici comment faire suivant de près le code présenté pour que vous sentez plus comfortable à suivre.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        for lignes in f1:
            #lignes1=lignes.rstrip("\n").replace("|"," ")
            lignes1=lignes.rstrip("\n")
            #matchs=re.search("^(\d+)	(([A-Z]+_\d+| )+)	(\S+)", lignes1)
            matchs=re.search("^(\d+)\s(([A-Z]+_\d+(\|?))+)\s(\d+\.[A-Z0-9]+)$", lignes1)
     
            if matchs:
                NCBItaxid=matchs.group(1)
                #refseq=matchs.group(2)
                refseq=matchs.group(2).replace("|", " ")
                #STRING=matchs.group(3)
                STRING=matchs.group(5)
                Dtraduction[STRING].add(refseq)
                print (Dtraduction)
    Je mets \s au lieu de " " pour voir plus claire et j'explicite un peu plus le dernier composant - mais si la structure apparante n'est pas générque par extrapolation, vous pouvez toujours y remettre comme ...(\S+)$.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 747
    Par défaut
    Salut,

    Citation Envoyé par Amniote Voir le message
    Mon objectif est de créer le dictionnaire Dtraduction sous cette forme
    Pourquoi partir dans les regex si vous ne savez pas les utiliser?
    Vos lignes sont de la forme:
    où items peut être item(|items)
    et que .split sait très bien découper:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> line = 'nnnn a|b|c clef\n'
    >>> line.strip().split(' ')
    ['nnnn', 'a|b|c', 'clef']
    >>>
    et on peut stocker çà directement dans le dico:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> dico = {}
    >>> dico[e[-1]] = e[1].split('|')
    >>> dico
    {'clef': ['a', 'b', 'c']}
    >>>
    Les expressions régulières permettent d'aller un peu plus loin dans la vérification que la ligne est bien construite. Par exemple si on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    9606 NP_001124506|NP_001180247|NP_919420|XP_005272332|XP_006713941 9606.ENSP00000389709
    Il peut être intéressant de s'assurer que la ligne commence bien par 4 digits suivis d'un espace. Que les NP_xx ou XP_xx commencent bien par suivis de... etc.
    Si c'est juste pour faire un découpage à la hache comme vous le feriez avec .split, autant utiliser .split: c'est bien plus simple.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Problème action sur élément courant, bouton
    Par Sterixdu92 dans le forum Forms
    Réponses: 4
    Dernier message: 18/06/2007, 14h59
  2. RollOver sur élément menustrip
    Par micfont999 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/01/2007, 00h05
  3. Infobulle sur élément de dessin
    Par bioinfx6996 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 05/01/2007, 11h47
  4. Regex sur adresse IP
    Par lobiman dans le forum Langage
    Réponses: 5
    Dernier message: 12/09/2006, 16h46
  5. Clic sur élément d'une requete affiché
    Par leloup84 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 08/02/2006, 00h38

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