簡體   English   中英

gsub:用正則表達式替換字符串替換正則表達式匹配項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM