我在R中有以下向量,我想找到所有字符串有A和B但不是数字2。
vec1<-c("A_cont_1", "A_cont_12", "B_treat_8", "AB_cont_22", "cont_21_Aa")
以下不起作用:
grep("A|B|!2", vec1)
它让我回到了所有的字符串:
[1] 1 2 3 4 5
这个例子也是如此:
grep("A|B|-2", vec1)
正确的语法是什么?
答案 0 :(得分:31)
您可以使用相当简单的正则表达式执行此操作:
grep("^[^2]*[AB][^2]*$", vec1)
用语言来表示:
^
匹配字符串的开头[^2]*
匹配除“2”以外的任何内容,零次或多次[AB]
匹配“A”或“B”[^2]*
匹配除“2”以外的任何内容,零次或多次$
匹配字符串的结尾答案 1 :(得分:21)
我会使用两个grep
来电:
intersect(grep("A|B",vec1),grep("2",vec1,invert=TRUE))
#[1] 1 3
答案 2 :(得分:19)
OP,你的尝试非常接近,试试这个:
grep('^(A|B|[^2])*$', vec1)
答案 3 :(得分:4)
grep
通常不能很好地在一次调用中进行正面和负面搜索。您可能能够使用复杂的正则表达式,但您可能会做得更好:
grep '[AB]' somefile.txt | grep -v '2'
R的等价物是:
grep("2", grep("A|B", vec1, value = T), invert = T)
答案 4 :(得分:0)
我扩展了@eddi提供的答案。我已经在R中对其进行了测试,并且对我有用。我更改了示例中的最后一个变量,因为它们都包含A | B。
# Create the vector from the OP with one change
vec1<-c("A_cont_1", "A_cont_12", "B_treat_8", "AB_cont_22", "cont_21_dd")
然后运行以下代码。它将告诉您应该从grep的每个部分获得哪些结果。
首先,请告诉我哪些列包含A或B
> grepl("A|B", vec1)
[1] TRUE TRUE TRUE TRUE FALSE
现在告诉我哪些列包含“ 2”
> grepl("2", vec1)
[1] FALSE TRUE FALSE TRUE TRUE
我们想要的索引是2,4
> grep("2", grep("A|B", vec1, value = T))
[1] 2 4
完成!