[英]gsub: replace regex match with regex replacement string
我需要用相等數量的零替換兩個以上的連續1。 目前,我可以找到如下所示的匹配項,但是在找到匹配項后,我不知道如何用確切的零替換
ind<-c(1,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,1,0,1,0,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,1,1,0)
gsub("([1])\\1\\1+","0",paste0(ind,collapse=""))
給
"11000001100011010010101000101000"
因為它只用一個0代替了比賽,但我需要
"11000000001100011010010101000000010100000"
您可以使用以下gsub替換:
ind<-c(1,1,0,0,0,1,1,1,1,0,1,1,0,0,0,1,1,0,1,0,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,1,1,0)
gsub("1(?=1{2,})|(?!^)\\G1","0",paste(ind,collapse=""), perl=T)
參見IDEONE演示 ,結果為[1] "11000000001100011010010101000000010100000"
。
該正則表達式基於Perl,因為它使用了預讀和\\G
運算符。
此正則表達式匹配:
1
文字1
如果... (?=1{2,})
-之后是2或更多1
s或... (?!^)\\\\G1
上一場比賽之后的任何1
。 有關\\G
運算符的更多詳細信息,請參見正則表達式中的\\ G有什么用? 在perldoc.perl.org中, \\ G在正則表達式中什么時候有用? 如此張貼。
不使用regex
但使用rle
解決方案:
x = rle(ind)
x$values[x$lengths>2 & x$values] <- 0
inverse.rle(x)
#[1] 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.