如何删除R中除某些特定字母外的所有字符串?

How to delete all strings except some specific letters in R?

研究了一段时间,没有找到我想要的。

我想做的是在字符串中保留一个精确的模式。

所以这是我的例子:

text=c("hello, please keep THIS","THIS is important","all THIS should be done","not exactly This","not THHIS")

如何在所有字符串中准确获得 "THIS":

res=c("THIS","THIS","THIS","","")

我试过gsub在r中,但我不知道如何匹配字符。

例如我试过:

gsub("(THIS).*", "\1", text) # This delete all string after "THIS".

gsub(".*(THIS)", "\1", text) # This delete all string before "THIS".

这将首先删除与 THIS 不匹配的元素,然后在将中间结果存储到变量时遵循您的原始想法。似乎您想为不匹配的元素设置空字符串,最后一行就是这样做的。

tmp <- text[grepl("THIS", text)]
gsub("(THIS).*", "\1", tmp) -> tmp
gsub(".*(THIS)", "\1", tmp) -> tmp
c(tmp, rep("", length(text) - length(tmp)))

gsub("[^THIS]","",text) 似乎可以解决问题? “[^THIS]”匹配除 THIS 之外的所有内容,gsub 将这些匹配替换为作为第二个参数给出的空字符串。看到评论,没有按预期工作。

我们可以使用str_extract

library(stringr)
str_extract(text, "THIS")
#[1] "THIS" "THIS" "THIS" NA  

NA 比 ""

更好

要将 THISTHAT 提取为 整个单词 ,您可以使用以下正则表达式:

\b(THIS|THAT)\b

其中 \b 是一个单词边界,(...|...) 是一个带有 | 交替运算符的捕获组(可以出现多次,可以添加更多的选择)。

由于 regmatchesgregexpr return 一个向量列表,每当找不到匹配项时都有一些空条目,您需要先将它们转换为 NA,然后 unlist,然后转到"".

这是一些 base R code:

> text=c("hello, please keep THIS","THIS is important","all THIS should be done","not exactly This","not THHIS", "THAT is something I need, too")
[1] "THIS" "THIS" "THIS" ""     ""     ""    
> matches <- regmatches(text, gregexpr("\b(THIS|THAT)\b", text))
> res <- lapply(matches, function(x) if (length(x) == 0) NA else x)
> res[is.na(res)] <- ""
> unlist(res)
[1] "THIS" "THIS" "THIS" ""     ""     "THAT"