2017-02-05 11 views
2

Я пытаюсь исключить определенные символы при использовании grep в R. Но я не могу получить результат, который я ожидаю.Почему это исключение grep не работает в R?

Вот код:

x <- c("a", "ab", "b", "abc") 
grep("[^b]", x, value=T) 
> [1] "a" "ab" "abc" 

Я хочу, чтобы захватить что-нибудь в векторе x, который не содержит b. Он не должен возвращать "ab" или "abc".

В конечном счете, я хочу выбрать любой элемент, содержащий "a", но не "b". Это результат, который я хотел бы ожидать:

grep("a[^b]", x, value=T) 
> [1] "a" 

Как я могу это сделать?

ответ

3

Попробуйте это:

grep("^[^b]*a[^b]*$", x, value=TRUE) 
# [1] "a" 

Он ищет начало строки, а затем позволяет любое количество символов, которые не являются «б», то «а», то любое число символов, которые не являются «b», а затем конец строки.

1

Мы можем использовать invert property of grep, который возвращает values, которые не совпадают. Таким образом, здесь он возвращает те значения, которые не имеют в них «b».

grep("b", x, value = TRUE, invert = TRUE) 
#[1] "a" 
1

Я получил результат, что вы ищете, используя это регулярное выражение в Grep:

grep("^[^b]*$", x, value=TRUE) 
[1] "a" 
+0

Не совсем. Это регулярное выражение отклоняет '' aa''. –

+0

Да, это правда. Но не было задачи принять «аа», используя регулярное выражение. В любом случае, добавив «*», разрешите эту проблему. Да? Наконец, регулярное выражение должно быть: 'grep ("^[^ b] * $ ", x, value = TRUE)' – jvb

+0

Задача состояла в том, чтобы отклонить все, что содержит «b» => в частности, принять «aa», , Я не специалист по регулярному выражению, но ваше новое предложение, похоже, работает. –