Необязательный символ Regex, которому предшествует отрицательный просмотр в R - PullRequest
0 голосов
/ 28 июня 2018

Предположим, у меня есть набор строк:

test <- c('MTB', 'NOT MTB', 'TB', 'NOT TB')

Я хочу написать регулярное выражение, чтобы оно совпадало либо с 'TB', либо с 'MTB' (например, с выражением "M? TB") строго, когда перед этим FAILS предшествует фраза "NOT" (включая пробел).

Следовательно, мой предполагаемый результат -

TRUE FALSE TRUE FALSE

Пока что я попробовал пару вариантов

grepl("(?<!NOT )M?TB", test, perl = T)

TRUE TRUE TRUE FALSE

Неудачно. Как видите, фраза «НЕ МТБ» соответствует критериям моего регулярного выражения.

Кажется, что вы включили необязательный символ "M?" кажется, заставляет R думать, что отрицательный взгляд сзади также необязателен. Я пытался использовать скобки для группировки шаблонов, таких как

grepl("(?<!NOT )(M?TB)")

TRUE TRUE TRUE FALSE

Что также не исключает фразу «НЕ MTB». По общему признанию, мне неясно, как скобки работают в регулярном выражении или даже в том, что означает «группировка» в этом контексте У меня возникли проблемы с поиском вопроса, связанного с тем, как группировать, требовать и «настраивать» различные части регулярного выражения, чтобы я мог сопоставить фразу , начинающуюся с необязательного символа и начинающуюся с отрицательного обратного просмотра . Как правильно написать такое выражение?

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Есть некоторый вопрос о том, что этот вопрос намеревается, но вот некоторый код, чтобы попробовать в зависимости от того, что нужно.

Добавлено: Постер пояснил, что № 2 и № 3 соответствуют искомым линиям.

1) Это можно сделать без регулярных выражений, подобных этому:

test %in% c("TB", "MTB")
## [1]  TRUE FALSE  TRUE FALSE

2) Если проблема не в точных совпадениях, верните совпадения в M? TB, которые также не соответствуют НЕ M? TB:

grepl("M?TB", test) & !grepl("NOT M?TB",test)
## [1]  TRUE FALSE  TRUE FALSE

3) Другой альтернативой является замена NOT M? TB на X, а затем grepl на M? TB:

grepl("M?TB", sub("NOT M?TB", "X", test))
## [1]  TRUE FALSE  TRUE FALSE
0 голосов
/ 28 июня 2018
test = c("MTB", "NOT MTB", "TB", "NOT TB", "THIS TB", "THIS NOT TB")

grepl("\\b(?<!NOT\\s)M?TB\\b",test,perl = TRUE)

[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE
0 голосов
/ 28 июня 2018

Мы могли бы использовать начало (^) и конец ($), чтобы соответствовать только этим словам

grepl("^M?TB$", test)
#[1]  TRUE FALSE  TRUE FALSE

Если в комментариях упоминаются другие строки, такие как @Wiktor Stribiżew, то одним из вариантов будет

test1 <- c(test, "THIS MTB")
!grepl("\\bNOT M?TB\\b", test1) & grepl("\\bM?TB\\b", test1)
#[1]  TRUE FALSE  TRUE FALSE  TRUE
...