gpt4 book ai didi

regex - 如何使用 stringr 的 replace_all() 函数替换字符串中的特定匹配项

转载 作者:行者123 更新时间:2023-12-04 19:01:40 25 4
gpt4 key购买 nike

stringr包有帮助str_replace()str_replace_all()职能。例如

mystring <- "one fish two fish red fish blue fish"

str_replace(mystring, "fish", "dog") # replaces the first occurrence
str_replace_all(mystring, "fish", "dog") # replaces all occurrences

惊人的。但是你怎么
  • 替换第二次出现的“鱼”?
  • 替换最后一次出现的“鱼”?
  • 替换倒数第二次出现的“鱼”?
  • 最佳答案

    对于第一个和最后一个,我们可以使用 stri_replace来自 stringi因为它有选择

     library(stringi)
    stri_replace(mystring, fixed="fish", "dog", mode="first")
    #[1] "one dog two fish red fish blue fish"

    stri_replace(mystring, fixed="fish", "dog", mode="last")
    #[1] "one fish two fish red fish blue dog"
    mode只能有值 'first'、'last' 和 'all'。因此,其他选项不在默认功能中。我们可能不得不使用 regex更改它的选项。

    使用 sub , 我们可以对单词进行第 n 次替换
    sub("^((?:(?!fish).)*fish(?:(?!fish).)*)fish", 
    "\\1dog", mystring, perl=TRUE)
    #[1] "one fish two dog red fish blue fish"

    或者我们可以使用
     sub('^((.*?fish.*?){2})fish', "\\1\\dog", mystring, perl=TRUE)
    #[1] "one fish two fish red dog blue fish"

    为简单起见,我们可以创建一个函数来执行此操作
    patfn <- function(n){
    stopifnot(n>1)
    sprintf("^((.*?\\bfish\\b.*?){%d})\\bfish\\b", n-1)
    }

    并替换第 n 次出现的 'fish',除了第一个可以使用 sub 轻松完成。或 str_replace 中的默认选项
    sub(patfn(2), "\\1dog", mystring, perl=TRUE)
    #[1] "one fish two dog red fish blue fish"
    sub(patfn(3), "\\1dog", mystring, perl=TRUE)
    #[1] "one fish two fish red dog blue fish"
    sub(patfn(4), "\\1dog", mystring, perl=TRUE)
    #[1] "one fish two fish red fish blue dog"

    这也适用于 str_replace
     str_replace(mystring, patfn(2), "\\1dog")
    #[1] "one fish two dog red fish blue fish"
    str_replace(mystring, patfn(3), "\\1dog")
    #[1] "one fish two fish red dog blue fish"

    基于上面提到的模式/替换,我们可以创建一个新函数来完成大部分选项
    replacerFn <- function(String, word, rword, n){
    stopifnot(n >0)
    pat <- sprintf(paste0("^((.*?\\b", word, "\\b.*?){%d})\\b",
    word,"\\b"), n-1)
    rpat <- paste0("\\1", rword)
    if(n >1) {
    stringr::str_replace(String, pat, rpat)
    } else {
    stringr::str_replace(String, word, rword)
    }
    }


    replacerFn(mystring, "fish", "dog", 1)
    #[1] "one dog two fish red fish blue fish"
    replacerFn(mystring, "fish", "dog", 2)
    #[1] "one fish two dog red fish blue fish"
    replacerFn(mystring, "fish", "dog", 3)
    #[1] "one fish two fish red dog blue fish"
    replacerFn(mystring, "fish", "dog", 4)
    #[1] "one fish two fish red fish blue dog"

    关于regex - 如何使用 stringr 的 replace_all() 函数替换字符串中的特定匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36368712/

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