使用定界符查找长度为n的所有可能的子字符串

时间:2019-06-26 15:05:08

标签: r

我遇到类似于Find all possible substrings of length n的问题。但是,我不想使用字符来查找所有可能的子字符串,而是想使用下划线之类的定界符来分割单词。

例如:

"423.A_425.A_429.B_440.A_480.C_502.B"

由此,我想使用n=3提取以下模式:

'423.A_425.A_429.B', '425.A_429.B_440.A', '429.B_440.A_480.C', '440.A_480.C_502.B'

使用n=4,子字符串应变为:

'423.A_425.A_429.B_440.A', '425.A_429.B_440.A_480.C', '429.B_440.A_480.C_502.B'

我尝试调整Julius Vainora的解决方案(见下文),在下划线之间使用模式,而不是按字符分割,但是还没有运气:

allsubstr <- function(x, n) unique(substring(x, 1:(nchar(x) - n + 1), n:nchar(x)))

然后我得到输出(使用n=3):

"423" "23." "3.A" ".A_" "A_4" "_42" "425" "25." "5.A" "429" "29." "9.B" ".B_" "B_4" "_44" "440" "40." "0.A" "_48" "480" "80." "0.C" ".C_" "C_5" "_50" "502" "02." "2.B"

什么可以替代?

2 个答案:

答案 0 :(得分:1)

我们可以在split_,然后使用combn查找所有可能的子字符串,然后找到paste

combn(unlist(strsplit(v1, "_")), 3, FUN = paste, collapse="_")

答案 1 :(得分:0)

OP似乎只希望组合具有与原始字符串中出现的顺序相同的组合。

v <- "423.A_425.A_429.B_440.A_480.C_502.B"

allsubstr <- function(string, size, delim) {
  vec_string <- unlist(strsplit(string, delim))

  if(size < 1 || size > length(vec_string))
    stop("size must be element of [1, ", length(vec_string), "]")

  if(size == 1)
    return(vec_string)

  idxs <- cbind(start = size:length(vec_string) - size + 1, 
                end = size:length(vec_string))
  mx <- apply(idxs, 1, function(i, s, d) s[c(i["start"]:i["end"])], s = vec_string, d = delim)
  apply(mx, 2, paste, collapse = delim)
}

然后我们可以做:

> allsubstr(v, 0, "_")
Error in allsubstr(v, 0, "_") : size must be element of [1, 6]

> allsubstr(v, 3, "_")
[1] "423.A_425.A_429.B" "425.A_429.B_440.A" "429.B_440.A_480.C" "440.A_480.C_502.B"

> allsubstr(v, 4, "_")
[1] "423.A_425.A_429.B_440.A" "425.A_429.B_440.A_480.C" "429.B_440.A_480.C_502.B"

> allsubstr(v, 7, "_")
Error in allsubstr(v, 7, "_") : size must be element of [1, 6]