我有一个文本字段,其中包含我在模式下创建的电子邮件地址
library(stringr)
str_extract_all(Data, "([a-zA-Z0-9.-])+@([a-zA-Z0-9.-])")
它完美无缺,可以检测到一切。但是,我需要从某些域名中排除电子邮件,例如gmail.com。例如,我不希望使用@gmail.com
的电子邮件。
使用not symbol(^
),我应该能够满足我的需求,但是,我不知道为什么在经过多次尝试将^gmail.com
添加到我的模式后才能获得库存。
答案 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)在一个步骤中过滤结果。