【问题标题】:R: extract string before and after keywordR:提取关键字前后的字符串
【发布时间】:2018-02-26 21:40:15
【问题描述】:

我想提取某些关键字之前的字符串和关键字之后的第一个元素。给定以下字符串和关键字,

s <- c("E123Apple12", "EJ23ZGrape0Z", "J8BananaZ!")
keywords <- c("Apple", "Grape", "Banana")

我希望输出为:E123EJ23ZJ8 用于关键字之前的字符串,10Z 用于紧随其后出现的第一个元素关键字。

使用sub(keywords, "\\1", s) 会出现以下错误:

Warning message:
In sub(keywords, "\\", s) :
  argument 'pattern' has length > 1 and only the first element will be used

【问题讨论】:

    标签: r regex


    【解决方案1】:

    您的关键字必须是正则表达式字符串,而不是表示多个匹配项的 R 向量。然后你可以用一个空字符串替换任何匹配的关键字,只留下它周围的字符:

    keywords <- "(Apple|Grape|Banana)"
    sub(keywords, "", s) # [1] "E123"  "EJ23Z" "J8"
    

    如果只想要关键字前后的字符,可以用.*匹配它们:

    s <- c("E123AppleABC", "EJ23ZGrapeDEF", "J8BananaGHI")
    keywords <- "(Apple|Grape|Banana).*"
    sub(keywords, "", s) # [1] "E123"  "EJ23Z" "J8"
    
    keywords <- ".*(Apple|Grape|Banana)"
    sub(keywords, "", s) # [1] "ABC"  "DEF" "GHI"
    

    【讨论】:

    • 谢谢。你能看看我上面修改过的帖子吗?
    • 如何在关键字之后提取第一个元素?而不是关键字之后的所有内容
    • 如果第一个元素是指字符,则省略*。对于正则表达式,. 表示匹配任何字符(一次),* 表示尽可能多次匹配前一个。
    • 抱歉,这会提取除第一个元素之外的所有内容。您可以匹配正则表达式中的第一个字符:keywords &lt;- "(Apple|Grape|Banana)(.).*",然后当您 sub 时,替换为第二个匹配:sub(keywords, "\\2", s)
    【解决方案2】:

    如果您有并行向量,一种方法是使用 strsplit,但您需要稍微调整一下结果。

    strsplit(s, keywords)
    

    结果:

    [[1]]
    [1] "E123" "12"  
    
    [[2]]
    [1] "EJ23Z" "0Z"   
    
    [[3]]
    [1] "J8" "Z!"
    

    您需要选择每个列表中的第一个成员,然后像这样组合成一个向量:

    unlist(lapply(strsplit(s, keywords), "[[", 1))
    

    哪些输出

    [1] "E123"  "EJ23Z" "J8" 
    

    如果你想要字符串后面的内容,就做

    unlist(lapply(strsplit(s, keywords), "[[", 2))
    

    【讨论】:

    • do.call(rbind,strsplit(s,keywords))
    【解决方案3】:
    for (x in keywords) {
      s <- gsub(paste0("(.*)", x), "\\1", s)
    }
    s
    # [1] "E123"  "EJ23Z" "J8" 
    

    【讨论】:

      【解决方案4】:
      keywords <- "(Apple|Grape|Banana)"
      sub(paste0("(.*)",keywords,".*"),'\\1',s)
      [1] "E123"  "EJ23Z" "J8"   
      sub(paste0(".*",keywords,"(\\w)",".*$"),'\\2',s)
      [1] "1" "0" "Z"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-24
        • 2022-11-01
        • 1970-01-01
        • 2020-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多