如何根据给定向量找到字符串中最长连续的连续字符集

sca*_*der 6 regex string r

我在 R 代码中有以下字符串。

aas <- "QAWDIIKRIDKK"
Run Code Online (Sandbox Code Playgroud)

我想检查包含以下向量中的字符的字符串的最长连续片段:

hydrophobic_res <- c("W", "F", "I", "L", "V", "M", "C", "A", "G")
Run Code Online (Sandbox Code Playgroud)

答案是:

AW, II
Run Code Online (Sandbox Code Playgroud)

其他例子:

QFILVMD -> FILVM
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 R 中做到这一点?

akr*_*run 3

一种选择 - 拆分字符串,将键向量中的不匹配元素替换为 NA,根据创建的数据进行分组pasteNA并根据max字符的最大数量对元素进行子集化

f1 <- function(str1, matchvec)
{
v1 <- strsplit(str1, "")[[1]]
v1[!v1 %in% matchvec] <- NA
v2 <- tapply(v1, with(rle(!is.na(v1)),
      rep(seq_along(values), lengths)),
   FUN = function(x) paste(x[!is.na(x)], collapse = ""))
unname(v2[nchar(v2) == max(nchar(v2))])


}
Run Code Online (Sandbox Code Playgroud)

-测试

> f1(aas, hydrophobic_res)
[1] "AW" "II"
> f1("QFILVMD", hydrophobic_res)
[1] "FILVM"
Run Code Online (Sandbox Code Playgroud)

基于正则表达式的选项 - 创建模式以删除不在 matchvec 中的所有字符gsub,根据字符数进行拆分和子集

f2 <- function(str1, matchvec)
  {
  pat <- sprintf("[^%s]", paste(matchvec, collapse = ""))
  v1 <- strsplit(gsub(pat, ",", str1), ",")[[1]]
  v1[nchar(v1) == max(nchar(v1))]
}
Run Code Online (Sandbox Code Playgroud)

-测试

> f2(aas, hydrophobic_res)
[1] "AW" "II"
> f2("QFILVMD", hydrophobic_res)
[1] "FILVM"
Run Code Online (Sandbox Code Playgroud)