3
votes

Rechercher des sous-chaînes imbriquées qui correspondent à un modèle dans une chaîne

Je dois trouver tous strong> sous-chaîne dans cette chaîne 'DGHDAGRTDRPDRMGIEGTRNELPVAYHYNRTLSSNAEPLVESYLTHVLMDDDVLPLISLFWTFGRGDVPRRY * AVR * GQRRDVTTEFIHLLRCLDLSSFACMCAPARH * SRSLLIYSPKRLRNIASHRSYGIVCTSG * CTWINV * QIS * FATH * SKCIAPNLSHADKPRSLVLTPTTLRFSKPAYRRPLIREAMDLWIRASICWGMGLLN * KDWP * ESGYAYYVCELESGLRLMNPDARGFSRV * HVCSSA * LTWPSPFPEQAFLLRFTEPRHKLLYV * D * VNACLVRSSASASIM ' commençant par le caractère M et se terminant par le caractère * .

J'ai essayé d'utiliser str_extract_all () et stri_extract_all () mais je ne parviens pas à obtenir le résultat souhaité:

MDDDVLPLISLFWTFGRGDVPRRY*
MCAPARH*
MDLWIRASICWGMGLLN*
MGLLN*
MNPDARGFSRV*
  • Windows 10
  • R version 3.5.2
  • R studio version 1.1.463
  • stringr version 1.4.0
  • Je suis désolé si j'ai utilisé le mauvais jargon, je suis encore nouveau dans la programmation.

    Merci pour toute votre aide!


    2 commentaires

    Vous ne pouvez pas voir ceux qui commencent par M à moins que vous ne vouliez simplement les diviser.


    Si nous examinons ce MDLWIRASICWGMGLLN * Un seul se termine par * .


    3 Réponses :


    1
    votes

    EDIT : Cela ne donne pas exactement le résultat souhaité, mais j'ai pensé que je le partagerais (puisque j'ai également passé du temps dessus):

       # [1] "MDDDVLPLISLFWTFGRGDVPRRY" "MCAPARH"                  "MGLLN"                   
       # [4] "MNPDARGFSRV" 
    

    ORIGINAL :

    Nous pouvons utiliser ( Cela a supprimé le * à la fin ):

    aa<-'DGHDAGRTDRPDRMGIEGTRNELPVAYHYNRTLSSNAEPLVESYLTHVLMDDDVLPLISLFWTFGRGDVPRRY*AVR*GQRRDVTTEFIHLLRCLDLSSFACMCAPARH*SRSLLIYSPKRLRNIASHRSYGIVCTSG*CTWINV*QIS*FATH*SKCIAPNLSHADKPRSLVLTPTTLRFSKPAYRRPLIREAMDLWIRASICWGMGLLN*KDWP*ESGYAYYVCELESGLRLMNPDARGFSRV*HVCSSA*LTWPSPFPEQAFLLRFTEPRHKLLYV*D*VNACLVRSSASASIM'
    aa
    res1<-unlist(strsplit(aa,".(?=M)",perl = TRUE))
    res2<-unlist(strsplit(res1[grep("\\*{1,}",res1)],"\\*"))
    res2[grep("^M",res2)]
    

    Résultat:

    library(stringi)
    result<-unlist(strsplit(aa,".(?=M.*)",perl = TRUE))
    res<-unlist(stri_split(unlist(result),regex="[A-Z](?<=\\*[A-Z]|(?<=\\M[A-Z]))"))
    res1<-res[grep("^M",unlist(res))]
    res1[stri_endswith(res1,charclass = "[*|W]")]
    #[1] "MDDDVLPLISLFWTFGRGDVPRRY*" "MCAPARH*"                  "MDLWIRASICW"              
    #[4] "MGLLN*"                    "MNPDARGFSRV*"
    


    2 commentaires

    Cela ne trouve pas toutes les sous-chaînes imbriquées de manière récursive


    Bon, il en manque un.



    3
    votes

    La nécessité de trouver toutes les sous-chaînes imbriquées suggère que la récursivité peut être le moyen le plus simple:

    Tout d'abord, supprimez tout après le * final (puisque les chaînes que nous recherchons doivent être délimitées par à la question).

    find.M = function(z){
      z = sub('.+?M', 'M', z)
      if (length(zz <- grep('.+M', z, value = T))) {
        c(z, find.M(sub('.+?M','M',zz)))
      }
      else z
    }
    
    find.M(y)
    # [1] "MGIEGTRNELPVAYHYNRTLSSNAEPLVESYLTHVLMDDDVLPLISLFWTFGRGDVPRRY"
    # [2] "MCAPARH"                                                     
    # [3] "MDLWIRASICWGMGLLN"                                           
    # [4] "MNPDARGFSRV"                                                 
    # [5] "MDDDVLPLISLFWTFGRGDVPRRY"                                    
    # [6] "MGLLN" 
    

    Maintenant, divisons ceci à chaque *

    y = grep('M', y, value = T)
    

    et ne conserver que les chaînes contenant au moins un M

    y = unlist(strsplit(x, '*', fixed = T))
    

    Nous utilisons maintenant une fonction récursive pour obtenir toutes les sous-chaînes

    x = sub("*[^*]+$", "", aa) 
    

    p>


    0 commentaires

    1
    votes

    Vous pouvez utiliser [^ \\ *] * pour faire correspondre tout sauf l'astérisque. En notant que vous voulez toutes les correspondances, y compris les motifs qui se chevauchent, nous pouvons ajouter une anticipation. Cela ne semble pas être pris en charge avec stringr mais fonctionne avec stringi::stri_match_all_regex():

    library(stringi)
    
    stri_match_all_regex(aa, '(?=(M[^\\*]*\\*))')[[1]][,2]
    
    # [1] "MGIEGTRNELPVAYHYNRTLSSNAEPLVESYLTHVLMDDDVLPLISLFWTFGRGDVPRRY*"
    # [2] "MDDDVLPLISLFWTFGRGDVPRRY*"                                    
    # [3] "MCAPARH*"                                                     
    # [4] "MDLWIRASICWGMGLLN*"                                           
    # [5] "MGLLN*"                                                       
    # [6] "MNPDARGFSRV*"
    


    0 commentaires