regex - sheet - str_detect r
Grep en R usando OR y NOT (4)
OP, tu intento está bastante cerca, prueba esto:
grep(''^(A|B|[^2])*$'', vec1)
Tengo el siguiente vector en R y me gustaría encontrar todas las cadenas que tienen A y B, pero no el número 2.
vec1<-c("A_cont_1", "A_cont_12", "B_treat_8", "AB_cont_22", "cont_21_Aa")
Lo siguiente no funciona:
grep("A|B|!2", vec1)
Me devuelve todas las cuerdas:
[1] 1 2 3 4 5
Lo mismo es cierto para este ejemplo:
grep("A|B|-2", vec1)
¿Cuál sería la sintaxis correcta?
Puedes hacer esto con una expresión regular bastante simple:
grep("^[^2]*[AB][^2]*$", vec1)
En palabras, significa:
-
^
coincide con el inicio de la cadena -
[^2]*
coincide con cualquier cosa excepto "2", cero o más veces -
[AB]
coincide con "A" o "B" -
[^2]*
coincide con cualquier cosa excepto "2", cero o más veces -
$
coincide con el final de la cadena
Yo usaría dos llamadas grep
:
intersect(grep("A|B",vec1),grep("2",vec1,invert=TRUE))
#[1] 1 3
grep
general, grep
no funciona muy bien para hacer una búsqueda positiva y una negativa en una invocación. Es posible que pueda hacer que funcione con una expresión regular compleja, pero quizás sea mejor que lo haga:
grep ''[AB]'' somefile.txt | grep -v ''2''
El equivalente en R de eso sería:
grep("2", grep("A|B", vec1, value = T), invert = T)