递归字符串命令
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"
我正在使用一些 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"