我有一列像这样的项目
{apple}
{orange}>s>
{pine--apple}
{kiwi}
{strawberry}>s>
我想过滤它,以便我只获得不仅仅是括号之间的单词的项目(但在括号之前或之后还有其他内容),所以在这个例子中我想选择这两个:
{orange}>s>
{strawberry}>s>
我使用dplyr
和stringr
尝试了以下代码,但即使在https://regexr.com/上正则表达式按预期工作,在R
它也没有(它只是var
列为空的选定行。我做错了什么?
d_filtered <- d %>%
filter(!str_detect(var, "\\{(.*?)\\}"))
答案 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>"