R регулярное выражение для замены всех периодов после переменного числа периодов, за которыми следует пробел / начало строки - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть следующие строки.Я хочу заменить все периоды, которые идут после 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 голосов
/ 27 сентября 2018

Попробуйте регулярное выражение (?<=\.{3})(\S+?)

Это заменит все периоды после 3 периодов на i.
регулярное выражение

gsub('(?<=\\.{3})(\\S+?)', 'i', x, perl = TRUE)
0 голосов
/ 27 сентября 2018

Вот способ получить желаемый результат, который немного неуклюж, но работает.По сути, кажется, что проблема с попыткой сделать это за один раз заключается в том, что вы не знаете, насколько велика будет замена, поэтому вы можете обойти это, выполняя по одному символу за раз ...

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 пакетом представ. (v0.2.0).

...