我剛開始再次使用R,我想知道是否有一種方法可以用通配符替換部分字符串。R - 用通配符替換部分字符串
例如:
說我有
S1 <- "aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa"
,我想方括號 'X',內取代一切使得新的字符串是
"aaaaaaaaa[x]aaaa[x]aaaa"
這是有可能在R做?
請注意方括號中的內容可以是可變長度的。
我剛開始再次使用R,我想知道是否有一種方法可以用通配符替換部分字符串。R - 用通配符替換部分字符串
例如:
說我有
S1 <- "aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa"
,我想方括號 'X',內取代一切使得新的字符串是
"aaaaaaaaa[x]aaaa[x]aaaa"
這是有可能在R做?
請注意方括號中的內容可以是可變長度的。
一個簡單的正則表達式將像
\\[.+?\\]
例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"
使用如下所示的積極lookahead和lookbehind斷言。
"(?<=\\[)[^\\[\\]]*(?=\\])"
然後用x
> S1<-'aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa'
> gsub("(?<=\\[)[^\\[\\]]*(?=\\])", "x", S1, perl=TRUE)
[1] "aaaaaaaaa[x]aaaa[x]aaaa"
說明更換匹配的字符:
(?<=\\[)
正回顧後發斷言,你要匹配的字符串必須由[
符號開頭。[^\\[\\]]*
匹配任何字符,但不匹配[
或]
零次或多次。(?=\\])
積極的前瞻斷言,匹配必須後跟]
符號。有沒有真正用在這裏向前看符號的!!!!!!似乎是一個矯枉過正 – vks 2014-12-02 11:59:01
lookarounds不在這裏矯枉過正。 – 2014-12-02 12:01:02
也可以嘗試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"
謝謝,爲此。另一個庫添加。 :) – dkr267 2014-12-02 11:31:21
雖然對'aaaaaaaaa [] aaaa [bbbbbbb] aaaa'不起作用。無論哪種方式,你都可以將你的答案包裝成'gsub(「\\ [[^ \\]] +」,「[x」,s1,perl = TRUE) – 2014-12-02 10:41:04
(+1)這是一個很好的 – 2014-12-02 10:00:23
@DavidArenburg感謝您的編輯。將更多的細節添加到答案 – nu11p01n73R 2014-12-02 10:04:17
如果括號中沒有任何內容,該怎麼辦?像「aaa [] aaa [bbb]」「?也許你可以用'*'替換'+'? – Cath 2014-12-02 10:06:59