查找并标注匹配的括号对

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找并标注匹配的括号对相关的知识,希望对你有一定的参考价值。

给定以下一串嵌套的小括号。

a = "[[[][]]][[[][][]]]"

我想找一下在以下情况下的一对开闭括号 a 并用常用的ID标记它们的位置。例如,我想创建一个ID的向量,它的样子是这样的

b = c(1,2,3,3,4,4,2,1,5,6,7,7,8,8,9,9,6,5)

例如,这里1和2的向量是 b 是对应的对括号,以此类推......

 [[[][]]][[[][][]]]
 1      1

 [[[][]]][[[][][]]]
  2    2

如有这方面的意见,非常感谢。

答案

很丑

a <- "[[[][]]][[[][][]]]"
s <- unlist(strsplit(a, ''))
i <- cumsum(s == '[') * (s == '[')

while (any(idx <- i == 0)) {
  ii <- min(which(idx))
  jj <- table(i[1:ii])
  i[ii] <- max(as.integer(names(jj[jj < 2])))
}
i
# [1] 1 2 3 3 4 4 2 1 5 6 7 7 8 8 9 9 6 5
另一答案

@rawr,没有。这个 是丑陋的。

library(data.table)
d = data.table(x = strsplit(a, "")[[1]])
d[ , g := cumsum(shift(cumsum(x == "[") == cumsum(x == "]"), fill = FALSE))]

d[ , ix := d[d[ , .I[1:(.N / 2)], by = g]$V1, {
  i = cumsum(x == "[")
  c(i, rev(i))}, by = g]$V1]

d[ , pair := .GRP, by = .(ix, (rowid(ix) - 1) %/% 2)] 

我想速度不是问题 但出于好奇,我发现我的... data.table 在大弦上更快,例如。a = paste(rep("[[[][]]][[[][][]]]", 1000), collapse = "").

all.equal(d$pair, i)
# TRUE

以上是关于查找并标注匹配的括号对的主要内容,如果未能解决你的问题,请参考以下文章

扩号匹配问题

数据结构_栈的应用

如何理解这段代码片段中的两对括号?

正则匹配替换字符串并标注

正则表达式 RegExp 对象

使用正则表达式在嵌套括号外查找匹配项