正则表达式:从电子邮件R中排除关键字

时间:2015-12-01 19:11:29

标签: r string

我有一个文本字段,其中包含我在模式下创建的电子邮件地址

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

它完美无缺,可以检测到一切。但是,我需要从某些域名中排除电子邮件,例如gmail.com。例如,我不希望使用@gmail.com的电子邮件。

使用not symbol(^),我应该能够满足我的需求,但是,我不知道为什么在经过多次尝试将^gmail.com添加到我的模式后才能获得库存。

1 个答案:

答案 0 :(得分:4)

以下是一些明显的方法,从......开始。

x       = c("Espanta@gmail.com","Frank@notgmail.com","Jaap@gmail.com.com")
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"

就代码复杂性和计算时间而言,第二种方法要好得多。有人可能会说,第一种方法是节省内存,但我真的怀疑这在实践中是个问题。

OP使用^gmail.com的想法不起作用,因为^在正则表达式中有两种用法:

  • 识别字符串的开头;和
  • 否定字符类[^...]中的字符。

为了躲避整个字符串,negative lookaheads and lookbehinds很方便,但我知道无法(1)从字符串中提取部分和(2)在一个步骤中过滤结果。