Регулярное выражение: исключить ключевые слова из электронной почты R

У меня есть текстовое поле с адресами электронной почты, для которых я сделал шаблон ниже

library(stringr)
str_extract_all(Data, "([a-zA-Z0-9.-])+@([a-zA-Z0-9.-])")

Работает отлично, все определяет. Однако мне нужно исключить электронные письма из определенных доменов, таких как gmail.com. Например, мне не нужны электронные письма с @gmail.com.

Используя не символ (^), я должен быть в состоянии достичь своей цели, однако я понятия не имею, почему я получаю акции после нескольких попыток добавления ^gmail.com к моему шаблону.


person Espanta    schedule 01.12.2015    source источник
comment
Пожалуйста, добавьте строку library(myfavpackage) перед вашим кодом для соответствующих пакетов. В любом случае, я думаю, что лучший/самый чистый способ - использовать ваш шаблон, а затем фильтровать результаты постфактум. Вместо жесткого кодирования ^gmail.com или чего-то подобного сохраните вектор доменов из черного списка, c("gmail.com","yahoo.com",...).   -  person Frank    schedule 01.12.2015
comment
Это правильное решение, однако я думал, что это неэффективный способ. Сначала мне нужно создать большой список электронных писем, а затем снова начать их удаление. Это станет сложнее, так как количество электронных писем в каждой записи велико (иногда 100 электронных писем в одной записи).   -  person Espanta    schedule 01.12.2015


Ответы (1)


Вот несколько очевидных путей, начиная с...

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