Регулярное выражение с исключениями - PullRequest
1 голос
/ 13 марта 2020

Я хочу знать, есть ли шаблон в векторе, скажем:

vector <- c(paste0(paste("MC", 1:25), c(rep("", 10), rep("-P1",10), rep("P1",5))), rep("RANDOM", 10),c("MC1","MC2","MC-3"), rep("MCRANDOM", 10))
vector

Я хочу те, которые имеют "M C" и сопровождаются числом. Между ними может быть число, или дефис или пробел, а затем число. Я хочу исключить те, которые являются частью большего кода, те, которые с P и другим числом, например: «M C 20-P1» «M C 21P1». Это обнаруживает те с M C и номером:

vector[grepl("MC( |-)*[0-9]{1,}", vector)]

Я пытался использовать ^ для исключения, но моя попытка не удалась:

vector[grepl("MC( |-)*[0-9]{1,}[^(-*)P]", vector)]

Как я могу совпадать только с M C и цифрами? (в моих реальных данных часть более крупного текста)

1 Ответ

1 голос
/ 13 марта 2020

Мы можем указать здесь начало (^) и конец ($), чтобы соответствовать строкам, начинающимся с 'M C', за которым следует пробел или -, а затем одна или несколько цифр (* 1004) *) до конца

grep("^MC[- ]?\\d+$", vector, value = TRUE)
#[1] "MC 1"  "MC 2"  "MC 3"  "MC 4"  "MC 5"  "MC 6"  
#[7] "MC 7"  "MC 8"  "MC 9"  "MC 10" "MC1"   "MC2"   "MC-3" 

Если MC может быть подстрокой, тогда вместо слова ^

используйте границу слова (\\b)
...