【问题标题】:How to delete all strings except some specific letters in R?如何删除R中除某些特定字母之外的所有字符串?
【发布时间】:2016-11-30 10:49:46
【问题描述】:

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

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

这是我的例子:

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","","")

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

例如我试过:

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

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

【问题讨论】:

  • 你试过什么?这里的确切规则是什么?删除所有非大写字母?
  • 我试过了:gsub("(THIS).*", "\\1", text) gsub(".*(THIS)", "\\1", text) gsub(".*(THIS)|(THIS).*", "\\1", text) 我发现 (THIS).* 意味着所有之后。所以我认为 .*(THIS) 是之前和 .*(THIS)|(THIS).* 是之前和之后
  • 请解释您对问题中的这段代码有什么问题。那么,你有一些单词列表要保留吗? 具体要求是什么
  • @Sotos,是的,我想完全匹配。
  • 所以正如@Wiktor 所说,您有一些要保留的单词列表?

标签: r regex gsub


【解决方案1】:

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

\b(THIS|THAT)\b

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

由于regmatchesgregexpr 在找不到匹配项时返回带有一些空条目的向量列表,因此您需要先将它们转换为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"

【讨论】:

    【解决方案2】:

    我们可以使用str_extract

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

    最好有NA而不是""

    【讨论】:

    • 是否有可能得到 "" 而不是 NA ?
    • XRSC 当然。 v1 &lt;- str_extract(text, "THIS"); v1[is.na(v1)] &lt;- ""
    • 谢谢。事实上,真正的问题是:我有“THIS”和“THAT”,我想匹配“THIS”或“THAT”。这是一个简单的方法吗? (我想过类似的事情:paste0(str_extract(tolower(text),"this"),str_extract(tolower(text),"that"))
    • @XRSC 试试str_extract(text, "THIS|THAT")
    【解决方案3】:

    这将首先删除与 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 将这些匹配替换为作为第二个参数给出的空字符串。见评论,没有按预期工作。

    【讨论】:

    • "[^THIS]" 匹配除 THIS 之外的所有内容 是错误的陈述。它匹配除THIS 以外的单个字符
    • @WiktorStribiżew 你是对的 gsub("[^THIS]", "", "TttttHIS") 也给出了 "THIS"
    • @WiktorStribiżew [^THIS] 匹配除 THIS 以外的单个字符,可以。可以用这四个字母一起表示匹配吗?
    • 我不明白你。如果您只需要提取THISTHAT 中的任何一个,请使用regmatches(text, gregexpr("\\b(THIS|THAT)\\b", text))
    • @WiktorStribiżew 完美!谢谢你。只是一个小问题:当 res 未列出时,character(0) 不会被带入向量中。怎么可能给 res 赋值 "" ,让 res 和 text 的长度一样?
    猜你喜欢
    • 1970-01-01
    • 2016-08-30
    • 2022-01-05
    • 2021-05-26
    • 2017-09-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多