2016-12-08 49 views
0

我需要一個使用gsub的正則表達式的幫助。把這個對象:R匹配和特定字符之間的空格

x <- "4929A 939 8229"

我想刪除「A」和「9」之間的空間,但我不知道如何搭配的唯一差異,而不是在第二空間的空間。我基本上是需要的是這樣的:

x <- gsub("A 9", "", x)

但我不知道怎麼寫的正則表達式不匹配的「A」和「9」,只有他們之間的空間。

在此先感謝!

+2

使用'子(」」, 「」,X)'(不'gsub') –

回答

2

您可以使用下面的正則表達式中sub

> x <- "4929A 939 8229" 
> sub("\\s+", "", x) 
[1] "4929A939 8229" 

\\s+將匹配1個或多個空格符號。

替換零件是一個空字符串。

online R demo

+1

只是FYI:'sub'用於只查找* first *匹配,並且只執行一個* single * regex替換。 –

+1

要刪除第二個空格,您需要'sub(「^(\\ S * \\ s + \\ S +)\\ s +」,「\\ 1」,x)' –

+0

好,太好了,謝謝。 – giraffehere

2

gsub匹配/使用中發現的所有正則表達式,而sub只匹配/使用第一個。所以

sub(" ", "", "4929A 939 8229") # returns "4929A939 8229" 

將做的工作

卸下第二/ n次occurence

你可以做到這一點如通過使用strsplit如下:

x <- c("4929A 939 8229", "4929A 9398229") 

collapse_nth <- function(x_split, split, nth, replacement){ 
    left <- paste(x_split[seq_len(nth)], collapse = split) 
    right <- paste(x_split[-seq_len(nth)], collapse = split) 
    paste(left, right, sep = replacement) 
} 

remove_nth <- function(x, nth, split, replacement = ""){ 
    x_split <- strsplit(x, split, fixed = TRUE) 
    x_len <- vapply(x_split, length, integer(1)) 
    out <- x 
    out[x_len>nth] <- vapply(x_split[x_len>nth], collapse_nth, character(1), split, nth, replacement) 
    out 
} 

它給你:

# > remove_nth(x, 2, " ") 
# [1] "4929A 9398229" "4929A 9398229" 

# > remove_nth(x, 2, " ", "---") 
# [1] "4929A 939---8229" "4929A 9398229" 
+1

如果您建議更換* literal *空格符號,則最好使用'sub(「」,「,x,fixed = TRUE)' –

+0

完美,謝謝。你知道是否有辦法做我想做的事?如果這是我需要的第二個空間而不是第一個?解決我的問題,只是想知道是否有辦法。 – giraffehere

+1

@giraffehere:請參閱我的編輯 – Rentrop

相關問題