R正则表达式将替换空格/行首开头的可变期间后的所有期间

时间:2018-09-27 04:09:34

标签: r regex pcre

我有以下字符串。我想替换最多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)

2 个答案:

答案 0 :(得分:4)

尝试正则表达式(?<=\.{3})(\S+?)

这会将3个期间之后的所有期间替换为i
regex

gsub('(?<=\\.{3})(\\S+?)', 'i', x, perl = TRUE)

答案 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创建。