2017-01-19 118 views
2

我想用R解析嵌套圓括號。不,這不是JASON。我見過用perl,PHP和Python的例子,但我無法得到任何東西在R.工作下面是一些數據的例子: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」 - 我編制了這些數據以幫助人們更好地看到三個父括號。

基本上我正在尋找一個標識父括號的函數。換句話說,一個函數可以找到不包含括號的圓括號,並返回給定字符串的所有實例。

任何想法?我很感激幫助。

回答

1

這裏是一個直接改編自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

假設有匹配paranthesis,你可以試試下面的(這就像一個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)"