Je dois trouver tous strong> sous-chaîne dans cette chaîne J'ai essayé d'utiliser Je suis désolé si j'ai utilisé le mauvais jargon, je suis encore nouveau dans la programmation. Merci pour toute votre aide! '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 * . str_extract_all () et stri_extract_all () mais je ne parviens pas à obtenir le résultat souhaité: MDDDVLPLISLFWTFGRGDVPRRY*
MCAPARH*
MDLWIRASICWGMGLLN*
MGLLN*
MNPDARGFSRV*
3 Réponses :
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*"
Cela ne trouve pas toutes les sous-chaînes imbriquées de manière récursive
Bon, il en manque un.
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>
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*"
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*.