【问题标题】:Insert a number after every occurence of a string from a set of strings in a string在字符串中的一组字符串中,每次出现一个字符串后插入一个数字
【发布时间】:2019-08-31 00:35:02
【问题描述】:

假设我有一组字符串strset <- c("Apple", "Ball", "Cat1s")

我正在寻找一种方法,在每次出现来自 strset 的字符串后插入一个给定的数字(例如 21),并将其转换为 "[Apple21][Ball21][Cat1s21|Apple21][Cat1s21|Blah:Ball21]" 等新字符串。

编辑:

[oneApple][Ball|Balls] 应该变成 [oneApple][Ball21|Balls] 而不是 [oneApple21][Ball21|Ball21s]

【问题讨论】:

  • [oneApple] 之类的文本需要什么?
  • 这是个好问题。应该是 [oneApple] 而不是 [oneApple21]

标签: r regex string


【解决方案1】:

pastecollapse="|" 一起使用,然后将gsub 与反向引用一起使用应该可以完成工作。

strset<-c("Apple", "Ball", "Cat1s")
str2<-"[Apple][Ball][Cat1s|Apple][Cat1s|Blah:Ball]"
gsub(paste0("(", paste0(strset, collapse="|"),")"), "\\121", str2)

【讨论】:

    【解决方案2】:

    这是一种使用gsub的方法-

    strset <- c("Apple", "Ball", "Cat1s")
    
    test <- "[Apple][Ball][Cat1s|Apple][Cat1s|Blah:Ball]"
    
    for(i in strset) {
      test <- gsub(i, paste0(i, "21"), test)
    }
    
    test
    [1] "[Apple21][Ball21][Cat1s21|Apple21][Cat1s21|Blah:Ball21]"
    

    【讨论】:

    • 哇,这很简单。非常感谢。
    • @elborrador 谢谢,但不太可能需要循环。查看其他答案。
    • @Shree - 这可能仍然是一个好主意。根据strset 中有多少字符串,正则表达式粘贴方法可能会失败,但仍会直接通过并快速完成。
    • @thelatemail 谢谢,很高兴知道。我对每次迭代都调用gsubpaste0 不太高兴。无论哪种方式,这是我几乎不存在的正则表达式技能所能做的最好的事情。
    【解决方案3】:

    我们也可以使用stringr::str_replace_all

    library(stringr)
    str_replace_all(strset1, paste0(strset, collapse = "|"), function(m) str_c(m, 21))
    #[1] "[Apple21][Ball21][Cat1s21|Apple21][Cat1s21|Blah:Ball21]"
    

    数据

    strset <- c("Apple", "Ball", "Cat1s")
    strset1 <- "[Apple][Ball][Cat1s|Apple][Cat1s|Blah:Ball]"
    

    【讨论】:

    • 加1用于替换功能。学到了一些新东西。
    【解决方案4】:

    为避免替换 [oneApple] 等字符串,您还需要在构建正则表达式模式时考虑 word boundaries

    strset<-c("Apple", "Ball", "Cat1s")
    str2<-"[Apple][Ball][Cat1s|Apple][Cat1s|Blah:Ball][oneApple][Ball|Balls]"
    gsub(paste0("(\\b(?:", paste0(strset, collapse="|"),")\\b)"), "\\121", str2)
    

    //output [1] "[Apple21][Ball21][Cat1s21|Apple21][Cat1s21|Blah:Ball21][oneApple][Ball21|Balls]"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2016-04-30
      相关资源
      最近更新 更多