我正在尋找拆分通用形式的字符串,其中方括號表示字符串的「部分」。例如:與正則表達式拆分字符串
x <- "[a] + [bc] + 1"
,並返回,看起來像一個特徵向量:
"[a]" " + " "[bc]" " + 1"
編輯:結束了使用此:
x <- "[a] + [bc] + 1"
x <- gsub("\\[",",[",x)
x <- gsub("\\]","],",x)
strsplit(x,",")
我正在尋找拆分通用形式的字符串,其中方括號表示字符串的「部分」。例如:與正則表達式拆分字符串
x <- "[a] + [bc] + 1"
,並返回,看起來像一個特徵向量:
"[a]" " + " "[bc]" " + 1"
編輯:結束了使用此:
x <- "[a] + [bc] + 1"
x <- gsub("\\[",",[",x)
x <- gsub("\\]","],",x)
strsplit(x,",")
我見過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"
這是一個偷懶的辦法:
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"
你說「懶」,因爲你正在使用的空間,而不是使用括號分開? – 2013-03-22 15:49:26
是的(沒有真正激烈的regexing) – 2013-03-22 16:23:40
你可以計算分割點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"
我們走了。在製作「新聞報道」方面取得巨大進展。不是我完全理解,但我認爲'gregexpr'會有用。我很驚訝你不需要在模式中使用「\\」。 – 2013-03-22 16:04:17
我覺得''''不需要轉義,因爲它不會被解釋爲字符類的結尾,因爲'['是的事實。嗯,不知道我很清楚:-) – juba 2013-03-22 16:05:46
我有同樣的想法,但它表明「特殊性」是更多的上下文依賴比我預期。 – 2013-03-22 16:10:01
及這裏的在括號分裂,並讓他們在結果中,使用正預測先行和回顧後一個版本:
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"
我喜歡這種方法,因爲它不依賴於空白分割。在輸出中維護空白對於此任務並不重要,因此我將其修改爲使用'strplit': – 2013-03-22 16:05:01
感謝您的積極評論,但我認爲@ juba是更好的答案。我將用它來構造一個簡單的解析函數,它接受一對參數來表示將被保留的開始和結束分隔符。 – 2013-03-22 16:08:42