代码之家  ›  专栏  ›  技术社区  ›  Tyler Rinker DaniM

R regex替换以空格/行首开头的可变周期数之后的所有周期

  •  1
  • Tyler Rinker DaniM  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  4
  •   Tyler Rinker DaniM    7 年前

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

    这将替换3个句点到之后的所有句点 i .
    regex

    gsub('(?<=\\.{3})(\\S+?)', 'i', x, perl = TRUE)
    
        2
  •  1
  •   Calum You    7 年前

    这里有一个方法来获得想要的结果,这是有点笨重,但工作。基本上看来,尝试一次性完成的问题是,你不知道替代品会有多大,所以你可以通过一次只做一个字符来解决这个问题。。。

    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      "
    

    创建日期:2018-09-26 reprex package (第0.2.0版)。