str_detect sheet regular punct examples cheat regex r grep

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)