【问题标题】:Extracting a pattern considering different patterns [duplicate]考虑不同模式提取模式[重复]
【发布时间】:2020-11-02 17:15:02
【问题描述】:

假设我有这个玩具矢量

vec <- c("FOO blabla", "fail bla", "blabla FEEbla", "textFOO", "textttt")
to_match <- c("FOO", "FEE")

我想获得一个与vec 相同长度的向量,其中仅存储来自to_match 的模式(如果存在),否则留下NA。因此,我想要的结果是

c("FOO", NA, "FEE", "FOO", NA)

我的第一个想法是用空格 ("") 替换所有 匹配 to_match 中任何模式的内容。我尝试了以下代码,它完全相反,即它用空格替换了 所做 匹配to_match 中的任何模式的所有内容。

sub(paste(to_match, collapse = "|"), "", vec)
# [1] " blabla"    "fail bla"   "blabla bla" "text"       "textttt" 

但是,我尝试在分组结构之前使用插入符号 (^) 来反转这种行为,但收效甚微。

# fail
sub(paste0("^(", paste(to_match, collapse = "|"), ")"), "", vec)
# [1] " blabla"       "fail bla"      "blabla FEEbla" "textFOO"       "textttt"  

我怎样才能达到所需的输出?

【问题讨论】:

    标签: r regex string vector


    【解决方案1】:

    您的方法是正确的,但您应该考虑提取您想要的模式,而不是删除您不想要的模式。

    library(stringr)
    str_extract(vec, str_c(to_match, collapse = "|"))
    #[1] "FOO" NA    "FEE" "FOO" NA   
    

    【讨论】:

    • Base-R 等效项:regmatches(vec, gregexpr(paste0(to_match,collapse="|"), vec))
    • stringr 非常干净的解决方案,感谢@Ronak!
    • @DanielO 感谢基本 R 解决方案,但是它返回一个列表而不是一个向量,如果我尝试 unlist NA 条目消失
    • Ronak 的答案当然要干净得多,但 Base-R 中有一些方法可以操纵输出。例如,如果您将我的最后一条评论指定为matches。然后你可以使用unlist(ifelse(lengths(matches) == 0,NA,matches)) 得到你想要的向量。
    • 知道了,谢谢@DanielO!
    猜你喜欢
    • 2015-03-20
    • 2019-02-15
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 2011-12-06
    • 2013-06-13
    相关资源
    最近更新 更多