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