2014-08-31 66 views
6

找到例如字符串「:[1-9] *」並僅保留該部分的最簡潔方法是什麼?如何查找字符串中的某個部分並僅保留該部分

你可以使用regexec來獲得起點,但沒有一個更清晰的方法來立即獲得值嗎?

例如:

test <- c("surface area: 458", "bedrooms: 1", "whatever") 
regexec(": [1-9]*", test) 

如何立即得到公正

c(": 458",": 1", NA) 

回答

7
library(stringr) 
str_extract(test, ":.*") 
#[1] ": 458" ": 1" NA  

或者一個更快的方法stringi

library(stringi) 
stri_extract_first_regex(test, ":.*") 
#[1] ": 458" ": 1" NA  

如果你需要保留值的一個臨屋區t沒有匹配

gsub(".*(:.*)", "\\1", test) 
#[1] ": 458" ": 1"  "whatever" 
+0

感謝。這不是奇怪,這不是在R的標準軟件包? – 2014-08-31 17:27:33

+0

@Kasper Van Lombeek我同意。我使用'stringr'很多 – akrun 2014-08-31 17:32:11

+0

他確實需要NA值嗎? – hwnd 2014-08-31 17:32:27

8

你可以使用base R來處理這個問題。

> x <- c('surface area: 458', 'bedrooms: 1', 'whatever') 
> r <- regmatches(x, gregexpr(':.*', x)) 
> unlist({r[sapply(r, length)==0] <- NA; r}) 
# [1] ": 458" ": 1" NA 

雖然,我覺得它更簡單,只是做...

> x <- c('surface area: 458', 'bedrooms: 1', 'whatever') 
> sapply(strsplit(x, '\\b(?=:)', perl=T), '[', 2) 
# [1] ": 458" ": 1" NA 
4

嘗試任何這些。前兩個僅使用R的基礎。最後一個假設我們要返回一個數字向量。

1)子

s <- sub(".*:", ":", test) 
ifelse(test == s, NA, s) 
## [1] ": 458" ": 1" NA 

如果可以有多於一個:在一個字符串,然後用"^[^:]*:"更換圖案。

2)strsplit

sapply(strsplit(test, ":"), function(x) c(paste0(":", x), NA)[2]) 
## [1] ": 458" ": 1" NA 

不要使用這一個,如果可以有不止一個:字符串。

3)strapplyc

library(gsubfn) 
s <- strapplyc(test, "(:.*)|$", simplify = TRUE) 
ifelse(s == "", NA, s) 
## [1] ": 458" ": 1" NA 

我們可以省略ifelse行,如果""是確定的,而不是NA

4)strapply如果這個想法真的有就行了一些數字和我們想要回號碼或NA那就試試這個:

library(gsubfn) 
strapply(test, "\\d+|$", as.numeric, simplify = TRUE) 
## [1] 458 1 NA 
相關問題