使用str_detect选择大括号之间的项目

时间:2018-03-20 16:21:11

标签: r dplyr

我有一列像这样的项目

{apple}
{orange}>s>
{pine--apple}
{kiwi}
{strawberry}>s>

我想过滤它,以便我只获得不仅仅是括号之间的单词的项目(但在括号之前或之后还有其他内容),所以在这个例子中我想选择这两个:

{orange}>s>
{strawberry}>s>

我使用dplyrstringr尝试了以下代码,但即使在https://regexr.com/上正则表达式按预期工作,在R它也没有(它只是var列为空的选定行。我做错了什么?

d_filtered <- d %>% 
  filter(!str_detect(var, "\\{(.*?)\\}"))

3 个答案:

答案 0 :(得分:2)

你的模式是说“匹配任何有括号的东西,它们之间有或没有东西”。然后,您使用!对其进行否定,因此过滤掉字符串中任何位置{后跟}的任何内容。

如果在括号之前或之后有某些内容,那么听起来就像你想要保留字符串一样,所以让我们匹配它。 .匹配任何(单个)事物,因此“开括号前的东西”的模式为".\\{"。类似地,“关闭括号后的东西”的模式是"\\}."。我们可以将它们与|连接为“或”。在filter中,使用

filter(str_detect(var, ".\\{|\\}."))

答案 1 :(得分:0)

这可以通过测试向量中的所有字符是否在[a-zA-Z]{}内来解决您的问题:

cl=c("{apple}",
"{orange}>s>",
"{pine--apple}",
"{kiwi}",
"{strawberry}>s>")
find=function(x){
  x=unlist(strsplit(x,""))
  poss=c(letters,LETTERS,"{","}")
  all(x%in%poss)
}
cl=cl[!sapply(cl,find)]

答案 2 :(得分:0)

也可以使用基础R的grep

> d = c("<s{apple}", "{orange}>s>", "{pine--apple}", "{kiwi}", "{strawberry}>s>")  
# I have added "<s" before {apple} in above vector

> d[grep(".\\{|}.", d)]
[1] "<s{apple}"       "{orange}>s>"     "{strawberry}>s>"