2013-03-22 10 views
8

大文字の文字列を分割すると、角括弧は文字列の「セクション」を表します。例:正規表現による分割文字列

x <- "[a] + [bc] + 1" 

などに見える文字ベクトルを返す:

"[a]" " + " "[bc]" " + 1" 

をEDIT:これを使用して終了:

x <- "[a] + [bc] + 1" 
x <- gsub("\\[",",[",x) 
x <- gsub("\\]","],",x) 
strsplit(x,",") 

答えて

6

私はTylerRinkerのコードを見て、それはこれ以上明確かもしれないが、これは機能の異なるセットを学ぶための方法として働くことができる疑いました。 (私はそれが空間上で分割されていることに気づく前に、彼の方が気に入っていました)。私はこれをstrsplitで動作させようと試みましたが、その機能は常に区切り文字を削除します。 newstrsplitをセパレータで分割して残しておくことは可能でしょうか?おそらく最初または最後の位置で分割したり、区切り文字を区切ったり区切ったりする必要があります。

scan(text= # use scan to separate after insertion of commas 
      gsub("\\]", "],", # put commas in after "]"'s 
      gsub(".\\[", ",[", x)) , # add commas before "[" unless at first position 
     what="", sep=",") # tell scan this character argument and separators are "," 
#Read 4 items 
#[1] "[a]" " +" "[bc]" " + 1" 
+0

私は分割のために空白に依存しないので、このアプローチが好きです。出力の空白を維持することはこの作業にとって重要ではなかったので、これを 'strplit'で動作するように変更しました: –

+0

肯定的なコメントをありがとうが、@ jubaの方が良い答えだと思っています。私はこれを使って、保存される開始区切りと終了区切りを示す一対の引数を受け取る単純な構文解析関数を構築します。 –

5

これは1つの怠惰なアプローチです:

FUN <- function(x) { 
    all <- unlist(strsplit(x, "\\s+")) 
    last <- paste(c(" ", tail(all, 2)), collapse="") 
    c(head(all, -2), last) 
} 

x <- "[a] + [bc] + 1"  
FUN(x) 

## > FUN(x) 
## [1] "[a]" "+" "[bc]" " +1" 
+0

あなたが「怠惰」と言うあなたは、スペースを使用してではなく、ブラケットを使用しているので、分離するために? –

+0

はい(実際の厳密な正規表現はありません) –

5

分割ポイントの計算を行うことができますYとsubstringを使用します。

split.pos <- gregexpr('\\[.*?]',x)[[1]] 
split.length <- attr(split.pos, "match.length") 
split.start <- sort(c(split.pos, split.pos+split.length)) 
split.end <- c(split.start[-1]-1, nchar(x)) 
substring(x,split.start,split.end) 
# [1] "[a]" " + " "[bc]" " + 1" 
+1

ここに行きます。 「ニュース板」を作るための大きな進歩。私はそれを完全に理解しているわけではありませんが、 'gregexpr'が役に立つと思いました。私はあなたがパターンで "\\"を使う必要がなかったのに驚いた。 –

+0

'' 'はエスケープする必要はないと思います。なぜなら、' [''は ''であるために文字クラスの終わりとして解釈されないからです。うーん、私は非常に明確だとは確信していません:-) – juba

+0

私は同じ考えを持っていましたが、「特殊性」は私が予想したよりも文脈に依存していることを示唆しています。 –

5

そして、ここでは、ブラケットに分割し、肯定先読みと後読みを使用して、結果にそれらを保持したバージョンです:

splitme <- function(x) { 
    x <- unlist(strsplit(x, "(?=\\[)", perl=TRUE)) 
    x <- unlist(strsplit(x, "(?<=\\])", perl=TRUE)) 
    for (i in which(x=="[")) { 
    x[i+1] <- paste(x[i], x[i+1], sep="") 
    } 
    x[-which(x=="[")] 
} 
splitme(x) 
#[1] "[a]" " + " "[bc]" " + 1" 
関連する問題