使用OR和NOT在R中Grep

时间:2013-08-14 16:59:53

标签: regex r grep

我在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)

正确的语法是什么?

5 个答案:

答案 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

完成!