用另一个重复的字符替换重复字符

时间:2014-10-30 10:31:53

标签: regex r

我想用连续的1替换字符串中的3个或更多个连续的0。示例:' 1001000001'变成' 1001111111'。

在R中,我写了以下代码:

gsub("0{3,}","1",reporting_line_string)

但显然它将5 0替换为1 1.如何获得5 1?

谢谢,

4 个答案:

答案 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)

这是一个基于您的方法的选项,但使用gregexprregmatches。可能还有更干的方法可以做到这一点,但现在我不会想到它......

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)

0(?=00)|(?<=00)0|(?<=0)0(?=0)

你可以试试这个。1。见。演示。

http://regex101.com/r/dP9rO4/5