2014-12-02 89 views
5

我剛開始再次使用R,我想知道是否有一種方法可以用通配符替換部分字符串。R - 用通配符替換部分字符串

例如:

說我有

S1 <- "aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa" 

,我想方括號 'X',內取代一切使得新的字符串是

"aaaaaaaaa[x]aaaa[x]aaaa" 

這是有可能在R做?

請注意方括號中的內容可以是可變長度的。

回答

8

一個簡單的正則表達式將像

\\[.+?\\] 

http://regex101.com/r/xE1rL1/1

示例用法

s1 <- 'aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa' 
gsub("\\[.+?\\]", "[x]", s1) 
## [1] "aaaaaaaaa[x]aaaa[x]aaaa" 

正則表達式

  • \\[匹配開口[

  • .+?的任何非貪婪匹配

  • \\]比賽閉]

EDIT

爲了安全起見,如果沒有出現在該[],那麼正則表達式可以稍加修改爲

s1 <- 'aaaaaaaaa[]aaaa[bbbbbbb]aaaa' 
gsub("\\[.*?\\]", "[x]", s1) 
##[1] "aaaaaaaaa[x]aaaa[x]aaaa" 
+1

(+1)這是一個很好的 – 2014-12-02 10:00:23

+0

@DavidArenburg感謝您的編輯。將更多的細節添加到答案 – nu11p01n73R 2014-12-02 10:04:17

+4

如果括號中沒有任何內容,該怎麼辦?像「aaa [] aaa [bbb]」「?也許你可以用'*'替換'+'? – Cath 2014-12-02 10:06:59

3

使用如下所示的積極lookahead和lookbehind斷言。

"(?<=\\[)[^\\[\\]]*(?=\\])" 

然後用x

> S1<-'aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa' 
> gsub("(?<=\\[)[^\\[\\]]*(?=\\])", "x", S1, perl=TRUE) 
[1] "aaaaaaaaa[x]aaaa[x]aaaa" 

說明更換匹配的字符:

  • (?<=\\[)正回顧後發斷言,你要匹配的字符串必須由[符號開頭。
  • [^\\[\\]]*匹配任何字符,但不匹配[]零次或多次。
  • (?=\\])積極的前瞻斷言,匹配必須後跟]符號。
+0

有沒有真正用在這裏向前看符號的!!!!!!似乎是一個矯枉過正 – vks 2014-12-02 11:59:01

+0

lookarounds不在這裏矯枉過正。 – 2014-12-02 12:01:02

5

也可以嘗試qdapRegex包,其中有這樣的問題的特殊方法:rm_square

library(qdapRegex) 
S1 <- "aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa" 
rm_square(S1, replacement = "[x]") 
## [1] "aaaaaaaaa[x]aaaa[x]aaaa" 

將工作同爲空方括號

S1 <- "aaaaaaaaa[]aaaa[bbbbbbb]aaaa" 
rm_square(S1, replacement = "[x]") 
## [1] "aaaaaaaaa[x]aaaa[x]aaaa" 
+2

謝謝,爲此。另一個庫添加。 :) – dkr267 2014-12-02 11:31:21

0
\\[[^\\]]+ 

你可以簡單地做到這一點,沒有預覽或soemthing.Rpelace由[x。看演示。

http://regex101.com/r/yR3mM3/13

+0

雖然對'aaaaaaaaa [] aaaa [bbbbbbb] aaaa'不起作用。無論哪種方式,你都可以將你的答案包裝成'gsub(「\\ [[^ \\]] +」,「[x」,s1,perl = TRUE) – 2014-12-02 10:41:04