【问题标题】:Export multiple matching pattern导出多个匹配模式
【发布时间】:2021-10-21 10:23:46
【问题描述】:

我正在尝试从下面的字符串中提取AOB1AOB2AOB3

df <- data.frame(
  id = c(1,2,3),
  string = c("acv-32-AOB1", "osa-122-AOB2","cds-543-rr-AOB3")
)

> df
  id          string
1  1     acv-32-AOB1
2  2    osa-122-AOB2
3  3 cds-543-rr-AOB3

有什么想法吗?

谢谢!

【问题讨论】:

    标签: r regex


    【解决方案1】:

    我们可以从base R使用trimws

    trimws(df$string, whitespace =".*-")
    [1] "AOB1" "AOB2" "AOB3"
    

    或者从base R使用sub

    sub(".*-", "", df$string)
    [1] "AOB1" "AOB2" "AOB3"
    

    或者如果我们需要提取“AOB”后跟数字

    library(stringr)
    str_extract(df$string, "AOB\\d+")
    [1] "AOB1" "AOB2" "AOB3"
    

    【讨论】:

    • trims 是否查看字符串的末尾?如果AOB1 是中间,这会起作用吗?
    • 是的,我立即使用了您的最后一个解决方案,并且效果很好。感谢您的宝贵时间!
    【解决方案2】:

    您可以为此使用正则表达式:

    1. .* 匹配任何东西
    2. (AOB[1-3]) 然后匹配 AOB 后跟 1、2 或 3
    3. \\1 用匹配的 AOB1-3 槽替换整个字符串
    gsub(".*(AOB[1-3])", "\\1", df$string)
    

    【讨论】:

    • 感谢您的意见。真的很感激!
    【解决方案3】:

    这里还有一位亲爱的朋友:

    m <- gregexpr("[a-zA-Z]{3}\\d{1}", df$string)
    
    unlist(regmatches(df$string, m))
    
    > unlist(regmatches(df$string, m))
    [1] "AOB1" "AOB2" "AOB3"
    

    【讨论】:

      【解决方案4】:

      我做了一些修改,以便您想要的模式可以无处不在,您可以使用以下解决方案来提取它:

      df$res <- gsub("(.*)?([A-Z]{3}\\d)(.*)?", "\\2", df$string, perl = TRUE)
      df
      
        id          string  res
      1  1     acv-32-AOB1 AOB1
      2  2    osa-122-AOB2 AOB2
      3  3 cds-543-rr-AOB3 AOB3
      

      【讨论】:

      • 谢谢兄弟,我努力改进:)
      • 感谢您的投入和时间。真的很感激!
      猜你喜欢
      • 2016-07-07
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 2013-05-01
      相关资源
      最近更新 更多