我有以下字符串。我想替换最多3个周期之后的所有周期,并在其开头以字母i
开头的行或空格。
x <- c(
".. ........ ....... ",
"... ........ ....... ",
". ..... ....... . .. ... .... ",
".. ..... ........... .... "
)
期望的输出:
x <- c(
".. ...iiiii ...iiii ",
"... ...iiiii ...iiii ",
". ...ii ...iiii . .. ... ...i ",
".. ...ii ...iiiiiiii ...i "
)
我非常错误的尝试:
gsub('(?:(?:^|\\s))(x)', '\\U\\1', gsub('\\.', 'x', x), perl = TRUE)
答案 0 :(得分:4)
答案 1 :(得分:1)
这是一种获得预期结果的方法,虽然有点笨拙,但是可以起作用。基本上,尝试一次完成操作似乎存在问题,就是您不知道替换的大小,因此可以一次执行一个字符来解决它...
x <- c(
".. ........ ....... ",
"... ........ ....... ",
". ..... ....... . .. ... .... ",
".. ..... ........... .... "
)
library(stringr)
dots_to_i <- function(chr){
pat_p <- "(?<=(^| )\\.{3})\\."
pat_i <- "(?<=i)\\."
while (any(str_detect(chr, pat_p)) | any(str_detect(chr, pat_i))){
chr <- chr %>%
str_replace_all(pat_p, "i") %>%
str_replace_all(pat_i, "i")
}
return(chr)
}
dots_to_i(x)
#> [1] ".. ...iiiii ...iiii " "... ...iiiii ...iiii "
#> [3] ". ...ii ...iiii . .. ... ...i " ".. ...ii ...iiiiiiii ...i "
由reprex package(v0.2.0)于2018-09-26创建。