【问题标题】:Find all possible substrings of length n using a delimiter使用分隔符查找所有可能的长度为 n 的子字符串
【发布时间】:2019-06-26 15:05:08
【问题描述】:

我遇到了类似于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"

还有什么可以替代的?

【问题讨论】:

  • 您可以添加当前方法的输出吗?这样人们甚至不必执行您的代码,并且可能已经发现了一些东西。
  • 感谢您的建议,我现在已经添加了我当前的输出。

标签: r


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    看起来 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]
    

    【讨论】:

    • 我确实想保留组合的顺序,所以这个解决方案最适合我。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 2021-08-12
    • 2015-11-27
    • 2013-12-14
    • 2021-06-07
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多