使用OR和NOT在R中Grep

Joh*_*eth 26 regex grep r

我在R中有以下向量,我想找到所有字符串有A和B,但不是数字2.

vec1<-c("A_cont_1", "A_cont_12", "B_treat_8", "AB_cont_22", "cont_21_Aa")
Run Code Online (Sandbox Code Playgroud)

以下不起作用:

grep("A|B|!2", vec1)
Run Code Online (Sandbox Code Playgroud)

它让我回到了所有的字符串:

[1] 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)

这个例子也是如此:

grep("A|B|-2", vec1)
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法?

Jos*_*ich 34

你可以用一个相当简单的正则表达式来完成这个:

grep("^[^2]*[AB][^2]*$", vec1)
Run Code Online (Sandbox Code Playgroud)

用语言来表示:

  • ^ 匹配字符串的开头
  • [^2]*匹配"2" 以外的任何内容,零次或多次
  • [AB] 匹配"A"或"B"
  • [^2]*匹配"2" 以外的任何内容,零次或多次
  • $ 匹配字符串的结尾


Blu*_*ter 22

我会用两个grep电话:

intersect(grep("A|B",vec1),grep("2",vec1,invert=TRUE))
#[1] 1 3
Run Code Online (Sandbox Code Playgroud)

  • 或者`setdiff(grep('A | B',vec1),grep('2',vec1))` (2认同)

edd*_*ddi 18

OP,你的尝试非常接近,试试这个:

grep('^(A|B|[^2])*$', vec1)
Run Code Online (Sandbox Code Playgroud)


twa*_*erg 5

grep通常在一次调用中进行正向和负向搜索的效果不太好。您也许可以使其与复杂的正则表达式一起使用,但您最好这样做:

 grep '[AB]' somefile.txt | grep -v '2'
Run Code Online (Sandbox Code Playgroud)

其 R 等效项为:

grep("2", grep("A|B", vec1, value = T), invert = T)
Run Code Online (Sandbox Code Playgroud)