使用str_detect在花括号之间选择项目

使用str_detect在花括号之间选择项目,r,dplyr,R,Dplyr,我有一列这样的项目 {apple} {orange}>s> {pine--apple} {kiwi} {strawberry}>s> 我希望对其进行过滤,以便只获取不只是括号中的一个单词的项目(但在括号之前或之后有其他内容),因此在本例中,我希望选择以下两项: {orange}>s> {strawberry}>s> 我使用dplyr和stringr尝试了以下代码,但即使正则表达式按预期工作,在R中它也没有(它只是选择了var列为空的行。我做错了

我有一列这样的项目

{apple}
{orange}>s>
{pine--apple}
{kiwi}
{strawberry}>s>
我希望对其进行过滤,以便只获取不只是括号中的一个单词的项目(但在括号之前或之后有其他内容),因此在本例中,我希望选择以下两项:

{orange}>s>
{strawberry}>s>
我使用
dplyr
stringr
尝试了以下代码,但即使正则表达式按预期工作,在
R
中它也没有(它只是选择了
var
列为空的行。我做错了什么

d_filtered <- d %>% 
  filter(!str_detect(var, "\\{(.*?)\\}"))
d_已过滤%
过滤器(!str\u detect(var,“\\{(.*?\\}”))
您的模式是“在有括号的地方匹配任何东西,括号之间有或没有东西”。然后您用
来否定它,所以过滤掉字符串中任何一个有
{
后跟
}
的东西

如果括号之前或之后有某个内容,听起来像是要保留字符串,那么让我们进行匹配。
匹配任何(单个)内容,因此“打开括号之前的内容”的模式是
“\\{”
。类似地,“关闭括号之后的内容”的模式是
“\\”
。我们可以将它们连接到“或”的
|
。在
过滤器中,使用

filter(str_detect(var, ".\\{|\\}."))
您的模式是“在有括号的地方匹配任何内容,括号之间有或没有内容”。然后您用
来否定它,因此过滤掉字符串中任何位置有
{
后跟
}
的内容

如果括号之前或之后有某个内容,听起来像是要保留字符串,那么让我们进行匹配。
匹配任何(单个)内容,因此“打开括号之前的内容”的模式是
“\\{”
。类似地,“关闭括号之后的内容”的模式是
“\\”
。我们可以将它们连接到“或”的
|
。在
过滤器中,使用

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

这将通过测试向量中的所有字符是否在
[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)]

这将通过测试向量中的所有字符是否在
[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)]

还可以使用基本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>"
>d=c(“s>”、“{pine--apple}”、“猕猴桃}”、“草莓}>s>”)
#我添加了“{草莓}>s>”

也可以使用基本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>"
>d=c(“s>”、“{pine--apple}”、“猕猴桃}”、“草莓}>s>”)
#我添加了“{草莓}>s>”

我不知道你为什么要排除非字母。OP说他们想保留像
{orange}>s>
这样的字符串,这些字符串中有
,并且没有提到“仅字母和括号”。我实际上排除了所有只有字母和括号的字符串。
cl[!sapply(cl,find)]
就是为了这个,虽然也许我应该在
find()
里面做。啊,我明白了。但是它没有返回OP想要的结果,因为它返回
“{pine--apple}”
,括号外没有任何内容,只是因为括号内有非字母。OP希望保留一个没有
的字符串,就像
{orange}s
一样,他们仍然希望保留。我同意。这
{orange}s
会是一个问题。我不知道你为什么要排除非字母。OP说他们想保留像
{orange}>s>
这样的字符串,这些字符串中有
,而没有提到“仅字母和括号”。我实际上排除了所有只有字母和括号的字符串。
cl[!sapply(cl,find)]
就是为了这个,虽然也许我应该在
find()
里面做。啊,我明白了。但是它没有返回OP想要的结果,因为它返回
“{pine--apple}”
,括号外没有任何内容,只是因为括号内有非字母。OP希望保留一个没有
的字符串,比如
{orange}s
,他们仍然希望保留。我同意。这个
{orange}s
将是一个问题。