r - 查找与字符串中的模式匹配的嵌套子字符串

标签 r regex

I need to find all the substring within this string 'DGHDAGRTDRPDRMGIEGTRNELPVAYHYNRTLSSNAEPLVESYLTHVLMDDDVLPLISLFWTFGRGDVPRRY*AVR*GQRRDVTTEFIHLLRCLDLSSFACMCAPARH*SRSLLIYSPKRLRNIASHRSYGIVCTSG*CTWINV*QIS*FATH*SKCIAPNLSHADKPRSLVLTPTTLRFSKPAYRRPLIREAMDLWIRASICWGMGLLN*KDWP*ESGYAYYVCELESGLRLMNPDARGFSRV*HVCSSA*LTWPSPFPEQAFLLRFTEPRHKLLYV*D* VNACLVRSSASASIM',以字符 M 开头,以字符 * 结尾。

我尝试使用 str_extract_all()stri_extract_all() 但我得不到我想要的结果:

aa <- 'DGHDAGRTDRPDRMGIEGTRNELPVAYHYNRTLSSNAEPLVESYLTHVLMDDDVLPLISLFWTFGRGDVPRRY*AVR*GQRRDVTTEFIHLLRCLDLSSFACMCAPARH*SRSLLIYSPKRLRNIASHRSYGIVCTSG*CTWINV*QIS*FATH*SKCIAPNLSHADKPRSLVLTPTTLRFSKPAYRRPLIREAMDLWIRASICWGMGLLN*KDWP*ESGYAYYVCELESGLRLMNPDARGFSRV*HVCSSA*LTWPSPFPEQAFLLRFTEPRHKLLYV*D*VNACLVRSSASASIM'

str_extract_all(aa, 'M.*\\*')[[1]]
[1] "MGIEGTRNELPVAYHYNRTLSSNAEPLVESYLTHVLMDDDVLPLISLFWTFGRGDVPRRY*AVR*GQRRDVTTEFIHLLRCLDLSSFACMCAPARH*SRSLLIYSPKRLRNIASHRSYGIVCTSG*CTWINV*QIS*FATH*SKCIAPNLSHADKPRSLVLTPTTLRFSKPAYRRPLIREAMDLWIRASICWGMGLLN*KDWP*ESGYAYYVCELESGLRLMNPDARGFSRV*HVCSSA*LTWPSPFPEQAFLLRFTEPRHKLLYV*D*"

stri_extract_all(aa, regex = ('M.*/*'))[[1]]
[1] "MGIEGTRNELPVAYHYNRTLSSNAEPLVESYLTHVLMDDDVLPLISLFWTFGRGDVPRRY*AVR*GQRRDVTTEFIHLLRCLDLSSFACMCAPARH*SRSLLIYSPKRLRNIASHRSYGIVCTSG*CTWINV*QIS*FATH*SKCIAPNLSHADKPRSLVLTPTTLRFSKPAYRRPLIREAMDLWIRASICWGMGLLN*KDWP*ESGYAYYVCELESGLRLMNPDARGFSRV*HVCSSA*LTWPSPFPEQAFLLRFTEPRHKLLYV*D*VNACLVRSSASASIM"

但我得到一个以第一个 M 开头并以最后一个 * 或以 aa 的最后一个字符结尾的子字符串.相反,我想得到的是所有子字符串,即使一个子字符串嵌套在另一个子字符串中也是如此:

MDDDVLPLISLFWTFGRGDVPRRY*
MCAPARH*
MDLWIRASICWGMGLLN*
MGLLN*
MNPDARGFSRV*

以下是我的软件版本的一些信息:

  • Windows 10
  • R 版本 3.5.2
  • R 工作室版本 1.1.463
  • stringr 版本 1.4.0

如果我用错了行话,我很抱歉,我对编程还是个新手。

谢谢大家的帮助!

最佳答案

查找所有嵌套子字符串的需要表明递归可能是最简单的方法:

首先删除最后的 * 之后的所有内容(因为根据问题,我们搜索的字符串必须由最后的 * 分隔)。

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

现在让我们在每个 *

处拆分它
y = unlist(strsplit(x, '*', fixed = T))

只保留至少包含一个M的字符串

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

现在我们使用递归函数来获取所有的子串

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" 

关于r - 查找与字符串中的模式匹配的嵌套子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55314281/

相关文章:

regex - Notepad++ 搜索并替换为制表符分隔文件

r - 为什么 range() 函数比 min 和 max 的组合慢?

R igraph最短距离

r - 如何在 kcca 方法中获取集群成员身份作为数据?

python - 后面只有数字的正则表达式

javascript - 具有多个条件的负先行

regex - 限制 XML 模式中的单词列表

r - Dplyr 或 data.table 根据另一列中的值合并分组数据中的连续行

r - 在 R 中插值(并避免负插值)

javascript - 如何读取正则表达式?