gpt4 book ai didi

r - 如何从右到左拆分字符串,如 Python 的 rsplit()?

转载 作者:行者123 更新时间:2023-12-01 08:30:26 28 4
gpt4 key购买 nike

假设一个向量:

xx.1 <- c("zz_ZZ_uu_d", "II_OO_d")

我想从最右边分割一个新向量并且只分割一次。预期的结果是:
c("zz_ZZ_uu", "d", "II_OO", "d").

这就像 python 的 rsplit() 函数。我目前的想法是反转字符串,并在 str_split() 中用 stringr 分割。

有什么更好的解决方案吗?

更新
这是我的解决方案,返回 n 个拆分,具体取决于 stringr 和 stringi。有人提供具有基本功能的版本会很好。
rsplit <- function (x, s, n) {
cc1 <- unlist(stringr::str_split(stringi::stri_reverse(x), s, n))
cc2 <- rev(purrr::map_chr(cc1, stringi::stri_reverse))
return(cc2)
}

最佳答案

负前瞻:

unlist(strsplit(xx.1, "_(?!.*_)", perl = TRUE))
# [1] "zz_ZZ_uu" "d" "II_OO" "d"

其中 a(?!b) 说要找到这样一个 a ,它后面没有 b 。在这种情况下 .*_ 意味着无论多远( .* )都不应该有更多的 _

然而,概括这个想法似乎并不容易。首先,请注意它可以用 _(?=[^_]*$) 重写为正向前瞻(找到 _ 后跟除 _ 之外的任何内容,这里 $ 表示字符串的结尾)。那么一个不太优雅的概括将是
rsplit <- function(x, s, n) {
p <- paste0("[^", s, "]*")
rx <- paste0(s, "(?=", paste(rep(paste0(p, s), n - 1), collapse = ""), p, "$)")
unlist(strsplit(x, rx, perl = TRUE))
}

rsplit(vec, "_", 1)
# [1] "a_b_c_d_e_f" "g" "a" "b"
rsplit(vec, "_", 3)
# [1] "a_b_c_d" "e_f_g" "a_b"

哪里例如如果 n=3 此函数使用 _(?=[^_]*_[^_]*_[^_]*$)

关于r - 如何从右到左拆分字符串,如 Python 的 rsplit()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20454768/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com