我想用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”是不可能的 - 我编造这些数据以帮助人们更好地看到三个父括号。
基本上我正在寻找一个识别父括号的函数。换句话说,一个函数可以找到括号中没有包含的括号,并返回给定字符串的所有实例。
有什么想法吗?我很感激帮助。
答案 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)"