R:解析嵌套的圆括号

  • 本文关键字:圆括号 嵌套 r regex
  • 更新时间 :
  • 英文 :


我想用R解析嵌套的括号。不,这不是JASON。我看到过使用perl、php和python的例子,但我在R中很难使用任何东西。下面是一些数据的例子:

(a(a(a)(aa(a)a)a)a)((b(b)b)b)(((cc)c)c)

我想将这个基于三个父圆括号的字符串拆分为三个单独的字符串:

(a(a(a)(aa(a)a)a)a)
((b(b)b)b)
(((cc)c)c)

我面临的挑战之一是,在父圆括号内的子圆括号总数以及连续的开括号或闭括号的数量方面,缺乏一致的结构。请注意数据中连续的带Bs和带Cs的括号。这使得尝试使用regex变得非常困难。此外,给定父圆括号内的数据与其他父圆括号有许多共同的字符,因此不可能查找所有的"a"s或"b"s——我编造这些数据是为了帮助人们更好地看到三个父圆括号。

基本上,我正在寻找一个识别父圆括号的函数。换句话说,一个函数可以找到不包含在括号中的括号,并返回给定字符串的所有实例。

有什么想法吗?我很感激你的帮助。

这里有一个直接改编自Regex Recursion的\((?>[^()]|(?R))*\):

s = "(a(a(a)(aa(a)a)a)a)((b(b)b)b)(((cc)c)c)"
matched <- gregexpr("\((?>[^()]|(?R))*\)", s, perl = T)
substring(s, matched[[1]], matched[[1]] + attr(matched[[1]], "match.length") - 1)
# [1] "(a(a(a)(aa(a)a)a)a)" "((b(b)b)b)"          "(((cc)c)c)"   

假设存在匹配的Paradishesion,您可以尝试以下操作(如果您熟悉计算理论,这就像PDA下推自动机):

str <- '(a(a(a)(aa(a)a)a)a)((b(b)b)b)(((cc)c)c)'
indices <- c(0, which(cumsum(sapply(unlist(strsplit(str, split='')), 
function(x) ifelse(x == '(', 1, ifelse(x==')', -1, 0))))==0))
sapply(1:(length(indices)-1), function(i) substring(str, indices[i]+1, indices[i+1]))
# [1] "(a(a(a)(aa(a)a)a)a)" "((b(b)b)b)"          "(((cc)c)c)"         

最新更新