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

Langage Perl Discussion :

REGEXP sous chaîne


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut REGEXP sous chaîne
    Bonjour,


    Voici mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my $sql0 = <<"SQL0";
    SELECT accession, organism, sequence
    FROM ma_table
    WHERE sequence REGEXP 'TGTAGACGTGACGATGTAACAC[ATCG]{100,}' OR sequence REGEXP '[ATCG]{100,}TGATACCGATCCCTAGAACAGAT' 
    SQL2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($subseq) = $sequence =~ m/((?:TGTAGACGTGACGATGTAACAC)?[ATCG]{100,250}(?:TGATACCGATCCCTAGAACAGAT)?)/;
    $sequence contient TGTAGACGTGACGATGTAACAC ou TGATACCGATCCCTAGAACAGAT ou les 2 polynucléotides séparés par 100 à 250 nucléotides.

    J'aimerais récupérer des sous-séquences de $sequence dont les 2 polynucléotides (TGTAGACGTGACGATGTAACAC et TGATACCGATCCCTAGAACAGAT) seraient les bornes. Si un seul polynucléotide est présent on récupère ce qu'il est possible de récupérer en gardant les même bornes.

    Le problème est que si je fais une recherche gourmande, je récupère d'office 250 nucléotides après le premier polynucléotide (ce qui peut dépasser le second polynucléotide) et dans le cas contraire ([ATCG]{100,250}?), je n'en récupère que 100 et le second polynucléotide est laissé de côté.

    Comment puis-je faire en une seule regexp?

    Merci pour votre aide,

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Erreur

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    As-tu essayé quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($subseq) = $sequence =~ m/((?:^|TGTAGACGTGACGATGTAACAC)[ATCG]{100,250}(?:TGATACCGATCCCTAGAACAGAT|$))/;

  4. #4
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    As-tu essayé quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($subseq) = $sequence =~ m/((?:^|TGTAGACGTGACGATGTAACAC)[ATCG]{100,250}(?:TGATACCGATCCCTAGAACAGAT|$))/;
    Je ne peux pas tester, mais je pense qu'il faut utiliser le caractère ungreedy pour la recherche des nucléotides.
    En l'état, sur une chaîne de longueur maximum, le motif va trouver 250 nucléotides, qu'il y ait présence ou non du polynucléotide à l'intérieur. Ensuite il va éventuellement backtracker ( beurk, c'est laid comme mot) et trouvera le polynucléotide de fin, mais pas celui qui est à l'intérieur.
    Bref, je m'explique comme un manche, mais la version ungreedy est à tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($subseq) = $sequence =~ m/((?:^|TGTAGACGTGACGATGTAACAC)[ATCG]{100,250}?(?:TGATACCGATCCCTAGAACAGAT|$))/;
    Jasmine, tu avais bien cerné le problème de gourmandise (normal, tu es une femme... ), et ton souci venait principalement du caractère optionnel du dernier polynucléotide. Enfin je pense, j'ai pas matière à tester...

  5. #5
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    J'avais résolu le problème en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	$sequence =~ s/.*(TGTAGACGTGACGATGTAACAC[ATCG]{100,250}).*/$1/;
    	$sequence =~ s/.*?([ATCG]{100,250}TGATACCGATCCCTAGAACAGAT).*/$1/;
    ... est-ce moins performant?

    Je vais tester vos réponses, merci pour votre aide.

  6. #6
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Maintenant que j'y regarde une deuxième fois, je vois un autre problème potentiel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:^|TGTAGACGTGACGATGTAACAC)
    En début de chaîne, il va forcément trouver ^ et ne cherchera pas le polynucléotide.

  7. #7
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Code s.n.a.f.u;4471190 : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:^|TGTAGACGTGACGATGTAACAC)

    Oui, il suffit d'inverser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:GCATATCAATAAGCGGAGGA|^)

    Citation Envoyé par s.n.a.f.u Voir le message
    Jasmine, tu avais bien cerné le problème de gourmandise (normal, tu es une femme... ),
    surtout le chocolat

    Citation Envoyé par s.n.a.f.u Voir le message
    mais vue ta solution, il semble que cette séquence n'est qu'une partie de la chaîne, c'est bien cela ?
    Oui, normalement, c'est bien cela mais tous les cas sont possibles avec des chaînes tronquées.

  8. #8
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Le problème est que parfois on retrouve TGTAGACGTGACGATGTAACAC suivit de plus de 250 nucléotides sans TGATACCGATCCCTAGAACAGAT et donc cela pose problème. Il faudrait qu'il s'arrête au 250ième si iol n'y a pas TGATACCGATCCCTAGAACAGAT et si on n'est pas à la fin :

    Peut-être ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($subseq) = $sequence =~ m/((?:TGTAGACGTGACGATGTAACAC|^)[ATCG]{100,250}?(?:TGATACCGATCCCTAGAACAGAT|\w))/;
    .. ça récupère le caractère (\w) en trop mais c'est un moindre mal.

  9. #9
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Et que donnerai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my ($subseq) = $sequence =~ m/^
    .*?                               # élimination des inopportuns en début de chaîne
    (                                 # début de capture
    (?: TGTAGACGTGACGATGTAACAC)?      # recherche du premier polynucleotide facultatif
    ( (?: [ATCG](?!\2) ){100,250})   # parcours des nucléotides intermédiaires
    (TGATACCGATCCCTAGAACAGAT)?        # deuxième polynucléotide facultatif
    )                                 # fin de capture
    /x;

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Question : si les motifs de début et de fin de séquence sont au début et en fin de chaine, ne suffirait-il pas de les supprimer, puis de vérifier qu'il reste bien entre 100 et 250 nucléotides ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $seq =~ s/^($start)?|($end)?$//g;
    if (length $seq > 100 && length $seq < 250) { ...

  11. #11
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Question : si les motifs de début et de fin de séquence sont au début et en fin de chaine, ne suffirait-il pas de les supprimer, puis de vérifier qu'il reste bien entre 100 et 250 nucléotides ?
    Je voudrais que ces 2 motifs soient les bornes de ma chaîne mais en réalité les séquences de départ sont beaucoup plus longues que cela et débordent de part et d'autre de ces motifs.

    Il est inutile de vérifier que la séquence intermédiaire soit comprises entre 100 et 250 nucléotides, elle fait toujours entre environ 130 et 150 nucléotides. (vérifié après l'utilisation des 2 substitutions).

    C'est très gentil de votre part de vouloir m'aider mais j'ai obtenu ce que je voulais. On peut néanmoins continuer de discuter par curiosité et pour le plaisir de résoudre ce problème autrement que par 2 substitutions.

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

Discussions similaires

  1. Extraction d'une sous-chaîne avec une regexp
    Par pc.bertineau dans le forum Langage
    Réponses: 3
    Dernier message: 25/05/2010, 17h38
  2. [RegEx] Sous-chaîne dans une sous-chaîne : optimisation RegExp
    Par mathieugamin dans le forum Langage
    Réponses: 3
    Dernier message: 17/12/2007, 09h44
  3. [Tableaux] Retrouver une sous chaîne.
    Par Huntress dans le forum Langage
    Réponses: 8
    Dernier message: 20/03/2006, 16h31
  4. Réponses: 28
    Dernier message: 22/09/2005, 12h57
  5. [String] Récupérer une sous -chaîne sans split
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 19/07/2004, 15h45

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