2017-01-19 5 views
2

Rを使用してネストしたカッコを解析したいと思います。いいえ、これはJASONではありません。R:ネストされたかっこを解析します。

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

私は3に基づいて、この文字列を分割したいと思います。ここではいくつかのデータの例がある私は、Perl、PHP、およびPythonの使用例を見てきましたが、私はR.で働くために何を得るトラブルを抱えています

(a(a(a)(aa(a)a)a)a) 

((b(b)b)b) 

(((cc)c)c) 

私が直面してい課題の一つ親括弧内の子括弧の合計組の面で一貫性のある構造の欠如があり、かつ連続的な開放または閉鎖括弧の数:親は3つの別々の列に括弧します。 BsとCのデータで連続したカッコが連続していることに注目してください。これは、正規表現を使用する試みを非常に困難にしています。また、与えられた親かっこ内のデータは、他の親かっこに多くの共通文字を持つため、すべての "a"や "b"を探すことはできません。

基本的に私は親かっこを識別する関数を探しています。つまり、かっこで囲まれていないかっこを見つけて、指定された文字列のすべてのインスタンスを返す関数です。

アイデア?私は助けに感謝します。ここで

答えて

1

が直接\\((?>[^()]|(?R))*\\)Regex Recursionからなっている1つである:あなたがしている場合、一致paranthesisがあると仮定すると

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

、あなたは次のことを試すことができます(これは、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)"   
関連する問題