2013-03-22 44 views
8

我正在尋找拆分通用形式的字符串,其中方括號表示字符串的「部分」。例如:與正則表達式拆分字符串

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

,並返回,看起來像一個特徵向量:

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

編輯:結束了使用此:

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': – 2013-03-22 16:05:01

+0

感謝您的積極評論,但我認爲@ juba是更好的答案。我將用它來構造一個簡單的解析函數,它接受一對參數來表示將被保留的開始和結束分隔符。 – 2013-03-22 16:08:42

5

這是一個偷懶的辦法:

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

你說「懶」,因爲你正在使用的空間,而不是使用括號分開? – 2013-03-22 15:49:26

+0

是的(沒有真正激烈的regexing) – 2013-03-22 16:23:40

5

你可以計算分割點manuall 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'會有用。我很驚訝你不需要在模式中使用「\\」。 – 2013-03-22 16:04:17

+0

我覺得''''不需要轉義,因爲它不會被解釋爲字符類的結尾,因爲'['是的事實。嗯,不知道我很清楚:-) – juba 2013-03-22 16:05:46

+0

我有同樣的想法,但它表明「特殊性」是更多的上下文依賴比我預期。 – 2013-03-22 16:10:01

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" 
相關問題