递归字符串命令

Recursive stringi commands

我正在使用一些 stringi 函数作为管道的一部分来清理一些字符串数据。

我希望这些函数是递归的,以便它们处理所有可能出现的 re,而不仅仅是第一个。我无法事前预测我需要 运行 正确清理数据的函数的次数。

library(stringi)

test_1 <- "AAA A B BBB"
str_squish(str_remove(x, "\b[A-Z]\b"))
result <- "AAA B BBB"
desired <- "AAA BBB"

test_2 <- "AAA AA BBB BB CCCC"
str_replace(test_2,"(?<=\s[A-Z]{2,3})\s","")
result <- "AAA AABBB BB CCCC"
desired <- "AAA AABBB BBCCCC"

我建议在这里使用基础 R 的 gsub,它可以进行全局正则表达式替换:

test_1 <- "AAA A B BBB"
result <- gsub("[ ]{2,}", " ", gsub("[ ]*\b[A-Z]\b[ ]*", " ", test_1))
result

[1] "AAA BBB"

也许使用 gsub,这将执行所有匹配项的替换:

test_1 <- "AAA A B BBB"
gsub(" +", " ", gsub("\b[A-Z]\b", "", test_1))
#[1] "AAA BBB"

test_2 <- "AAA AA BBB BB CCCC"
gsub("(?<=\s[A-Z]{2})\s", "", test_2, perl=TRUE)
#[1] "AAA AABBB BBCCCC"

对于正则表达式 (?<=\s[A-Z]{2,3})\s 不清楚何时应该观察 2-3 的条件以及从哪里开始:例如stringr::str_replace_all 会给出:

stringr::str_replace_all(test_2,"(?<=\s[A-Z]{2,3})\s","")
#[1] "AAA AABBBBBCCCC"

您也可以使用递归函数调用:

f <- function(x) {
  y <- stringr::str_replace(x, "(?<=\s[A-Z]{2,3})\s","")
  if(x == y) x
  else f(y)
}
f(test_2)
#[1] "AAA AABBB BBCCCC"