R:解析嵌套括号

时间:2017-01-19 18:25:14

标签: 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的连续打开括号。这使得使用正则表达式的尝试非常困难。此外,给定父括号内的数据将与其他父括号有许多共同的字符,因此寻找所有“a”或“b”是不可能的 - 我编造这些数据以帮助人们更好地看到三个父括号。

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

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

2 个答案:

答案 0 :(得分:2)

以下是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)"   

答案 1 :(得分:1)

假设有匹配的paranthesis,你可以尝试以下(如果你熟悉计算理论,这就像 PDA 下推自动机): / p>

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)"