Вот несколько очевидных путей, начиная с...
x = c("[email protected]","[email protected]","[email protected]")
baddoms = c("gmail.com","yahoo.com")
сначала отфильтруй...
str_split_fixed(x[grep(paste0("@(",paste(baddoms,collapse="|"),")$"), x, invert=TRUE)], "@", 2)
# [,1] [,2]
# [1,] "Frank" "notgmail.com"
# [2,] "Jaap" "gmail.com.com"
...или отфильтровать потом...
y = str_split_fixed(x, "@", 2)
y[!(y[,2] %in% baddoms),]
# [,1] [,2]
# [1,] "Frank" "notgmail.com"
# [2,] "Jaap" "gmail.com.com"
Что касается сложности кода и времени вычислений, то второй подход намного лучше. Можно возразить, что первое означает экономию оперативной памяти, но я очень сомневаюсь, что на практике это будет проблемой.
Идея ОП об использовании ^gmail.com
не работает, потому что ^
имеет два применения в регулярном выражении:
- определение начала строки; а также
- отрицание символов внутри класса символов
[^...]
.
Чтобы избежать целых строк, удобны отрицательные просмотры вперед и назад, но я не знаю способа (1) извлечь части из строка и (2) результаты фильтрации за один шаг.
person
Frank
schedule
01.12.2015
library(myfavpackage)
перед вашим кодом для соответствующих пакетов. В любом случае, я думаю, что лучший/самый чистый способ - использовать ваш шаблон, а затем фильтровать результаты постфактум. Вместо жесткого кодирования^gmail.com
или чего-то подобного сохраните вектор доменов из черного списка,c("gmail.com","yahoo.com",...)
. - person Frank   schedule 01.12.2015