2017-01-19 4 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. Это очень затрудняет использование regex. Кроме того, данные в заданных родительских скобках будут иметь много общих символов в других родительских скобках, поэтому поиск всех «а» или «б» невозможен - я сфабриковал эти данные, чтобы помочь людям лучше видеть три родительских круглых скобки.

В основном я ищу функцию, которая идентифицирует родительские скобки. Другими словами, функция, которая может найти круглые скобки, которые не содержатся в круглых скобках, и возвращает все экземпляры этого для данной строки.

Любые идеи? Я ценю помощь.

ответ

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)"   
Смежные вопросы