我想用连续的1替换字符串中的3个或更多个连续的0。示例:' 1001000001'变成' 1001111111'。
在R中,我写了以下代码:
gsub("0{3,}","1",reporting_line_string)
但显然它将5 0替换为1 1.如何获得5 1?
谢谢,
答案 0 :(得分:5)
您可以使用gsubfn
功能,您可以提供替换函数来替换正则表达式匹配的内容。
require(gsubfn)
gsubfn("0{3,}", function (x) paste(replicate(nchar(x), "1"), collapse=""), input)
如果您安装了paste(replicate(nchar(x), "1"), collapse="")
软件包,则可以将stri_dup("1", nchar(x))
替换为stringi
。
或者更简洁的解决方案,如评论中提到的G. Grothendieck:
gsubfn("0{3,}", ~ gsub(".", 1, x), input)
或者,您可以在Perl模式下使用以下正则表达式来替换:
gsub("(?!\\A)\\G0|(?=0{3,})0", "1", input, perl=TRUE)
通过更改0
部分,它可以扩展到任意数量的连续0{3,}
。
我个人并不赞同使用这种解决方案,因为它的可维护性较差。
答案 1 :(得分:2)
这是一个基于您的方法的选项,但使用gregexpr
和regmatches
。可能还有更干的方法可以做到这一点,但现在我不会想到它......
x <- c("1001000001", "120000siw22000100")
x
# [1] "1001000001" "120000siw22000100"
a <- regmatches(x, gregexpr("0{3,}", x))
regmatches(x, gregexpr("0{3,}", x)) <- lapply(a, function(x) gsub("0", "1", x))
x
# [1] "1001111111" "121111siw22111100"
答案 2 :(得分:1)
对于regex
无知者(像我一样),尝试一些蛮力。使用strsplit
将字符串拆分为单个字符,使用rle
查找连续的“0”运行,使用rep
创建相关索引的向量(运行长度为“0”> 2) ,在索引paste
处插入“1”到单个字符串。
x2 <- strsplit(x = "1001000001", split = "")[[1]]
r <- rle(x2 == "0")
idx <- rep(x = r$lengths > 2, times = r$lengths)
x2[idx] <- "1"
paste(x2, collapse = "")
# [1] "1001111111"
答案 3 :(得分:0)