2013-08-14 28 views
19

Tôi có vectơ sau trong R và tôi muốn tìm tất cả chuỗi có A và B nhưng không phải số 2 trong đó.Grep in R sử dụng OR và NOT

vec1<-c("A_cont_1", "A_cont_12", "B_treat_8", "AB_cont_22", "cont_21_Aa") 

Sau đây không hoạt động:

grep("A|B|!2", vec1) 

Nó mang lại cho tôi trở lại tất cả các chuỗi:

[1] 1 2 3 4 5 

Điều này cũng đúng cho ví dụ này:

grep("A|B|-2", vec1) 

Cú pháp chính xác sẽ là gì?

+2

làm bạn muốn kết hợp '(A HOẶC B) VÀ KHÔNG 2' hay bạn muốn 'A OR B OR (NOT 2)'? –

Trả lời

4

grep thường không hoạt động tốt để thực hiện tìm kiếm tích cực và tiêu cực trong một lần gọi. Bạn có thể có thể làm cho nó làm việc với một biểu thức chính quy phức tạp, nhưng bạn có thể được tốt hơn off chỉ thực hiện:

grep '[AB]' somefile.txt | grep -v '2' 

R tương đương với đó sẽ là:

grep("2", grep("A|B", vec1, value = T), invert = T) 
+0

Cảm ơn. Tôi đã thử, nhưng nó không thích cú pháp này. :( –

20

Tôi sẽ sử dụng hai grep gọi:

intersect(grep("A|B",vec1),grep("2",vec1,invert=TRUE)) 
#[1] 1 3 
+0

Tuyệt vời! Điều này làm việc. Cảm ơn một lần nữa –

+2

hoặc 'setdiff (grep ('A | B', vec1), grep ('2', vec1))' – eddi

+0

Điều này có tác dụng, cảm ơn. –

24

Bạn có thể làm điều này với một biểu thức chính quy khá đơn giản:

grep("^[^2]*[AB][^2]*$", vec1) 

Nói cách, nó có nghĩa là:

  • ^ trận đấu khởi đầu của chuỗi
  • [^2]* trận đấu bất cứ điều gì trừ "2", bằng không hoặc nhiều lần
  • [AB] trận đấu "A" hoặc " B "
  • [^2]* đối sánh mọi thứ ngoại trừ" 2 ", không hoặc nhiều lần
  • .210
  • $ phù hợp với sự kết thúc của chuỗi
14

OP, nỗ lực của bạn là khá chặt chẽ, cố gắng này:

grep('^(A|B|[^2])*$', vec1) 
+1

Đây có thể là –

+0

tổng quát hơn nếu bạn thích 'grep ('^ (A | B | [^ [: chữ số:]]) * $', vec1)' – schlusie

Các vấn đề liên quan