2012-06-13 77 views
15

R中的一個strsplit函數是匹配並刪除給定的正則表達式,將字符串的其餘部分拆分爲向量。我應該如何使用strsplit分割和保留元素?

>strsplit("abc123def", "[0-9]+") 
[[1]] 
[1] "abc" "" "" "def" 

但我應該如何使用正則表達式分割字符串,但也保留匹配?我需要像下面這樣的東西。

>FUNCTION("abc123def", "[0-9]+") 
[[1]] 
[1] "abc" "123" "def" 

使用strapply(「abc123def」,「[0-9] + | [AZ] +」)在這裏工作,但如果不是比賽以外的字符串的其餘部分不能用正則表達式來捕獲?

+0

可以使用圖案捕獲所有字符「[0-9] + | [^ 0-9] +」或擴展圖案來捕獲一切,使用函數FUN =函數從輸出丟棄它(x)如果(grepl(「^ [0-9a-z] + $」,x))x –

+0

嗨,我看你是新來的SO。如果您覺得答案可以解決問題,請點擊綠色複選標記將其標記爲「已接受」。這有助於將注意力集中在仍然沒有答案的舊版SO上。 http://meta.stackexchange.com/questions/88535/asking-for-someone-to-accept-your-answer/135824#135824 –

回答

22

基本上,在我看來,你想要的不是拆分[0-9]+,而是拆分[0-9]+和其他所有東西之間的轉換。在您的字符串中,該轉換不是預先存在的。要插入它,你可以預先處理與gsub和背參考:

test <- "abc123def" 
strsplit(gsub("([0-9]+)","~\\1~",test), "~") 

[[1]] 
[1] "abc" "123" "def" 
+0

永遠不會知道反向引用的正則表達式。這是我想要的,並且非常感謝。 – jackson

+0

很高興解決了正確的問題:-) –

+1

真的很漂亮的把戲! – voidHead

2

您可以從gsubfn包strapply使用。

test <- "abc123def" 
strapply(X=test, 
     pattern="([^[:digit:]]*)(\\d+)(.+)", 
     FUN=c, 
     simplify=FALSE) 

[[1]] 
[1] "abc" "123" "def" 
5

您可以使用lookaround斷言。

> test <- "abc123def" 
> strsplit(test, "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)", perl=T) 
[[1]] 
[1] "abc" "123" "def" 
+6

爲什麼downvote?它適用於這種輸入。 –

+1

+1:它不僅工作,我覺得這個解決方案更加優雅!考慮一個你想要在遇到加號或減號運算符時分割公式的情況。在你之間有你想編輯的變量名稱。因此,您可以將其拆分,將操作符保留爲單獨的字符串,編輯變量名稱,然後再次重新組合整個字符串。與此解決方案完美配合,不會損失正負運算符! – ToJo

相關問題