使用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
将是一个问题。