从分号分隔的电子邮件向量中提取具有特定域的电子邮件

Posted

技术标签:

【中文标题】从分号分隔的电子邮件向量中提取具有特定域的电子邮件【英文标题】:Extract e-mail with a certain domain from a semicolon-separated vector of e-mails 【发布时间】:2019-10-12 02:39:54 【问题描述】:

考虑以下电子邮件向量:

emails <- c("blah@my.blah.com;etc@etc.edu;me@me.gov",
            "yay@something.gov;yes@my.blah.com;maybe@maybe.net",
            "someemail@nothing.gov")

上述向量的每个元素都是一个以分号分隔的用户电子邮件地址字符串。在这种情况下,例如,第一个用户有三个电子邮件:blah@my.blah.cometc@etc.edume@me.gov

我有一个我感兴趣的特定域名 - 假设它是 my.blah.com。我还知道一个事实,鉴于我对这个问题的领域知识,每个用户只能有一个my.blah.com 电子邮件地址,如果它存在的话。我想将每个用户的这个电子邮件地址作为字符向量返回,并在my.blah.com 电子邮件地址不存在的情况下返回NA

因此,输出应该是

c("blah@my.blah.com", "yes@my.blah.com", NA)

我最好的尝试是

emails <- c("blah@my.blah.com;etc@etc.edu;me@me.gov",
            "yay@something.gov;yes@my.blah.com;maybe@maybe.net",
            "someemail@nothing.gov")

regmatches(emails,
           regexec("+.*@my.blah.com", 
                   emails))

[[1]]
[1] "blah@my.blah.com"

[[2]]
[1] "yay@something.gov;yes@my.blah.com"

[[3]]
character(0)

这不是字符向量,但我现在正努力让 RegEx 正确,这是我想要关注的。

【问题讨论】:

【参考方案1】:

我们可以拆分";" 上的字符串,然后使用grep 和以"my.blah.com" 结尾的pattern,并返回value 以匹配那些匹配。

sapply(strsplit(emails, ";"), grep, pattern = "@my\\.blah\\.com$", value = TRUE)

#[[1]]
#[1] "blah@my.blah.com"

#[[2]]
#[1] "yes@my.blah.com"

#[[3]]
#character(0)

【讨论】:

【参考方案2】:

这是使用regmatches 的一种方法,与您尝试做的事情类似:

emails <- c("blah@my.blah.com;etc@etc.edu;me@me.gov",
            "yay@something.gov;yes@my.blah.com;maybe@maybe.net;stuff@my.blah.com",
            "someemail@nothing.gov")

sapply(emails, function(x) 
    m <- gregexpr("[^;]+@my\\.blah\\.com", x)
    regmatches(x, m)
)
names(matches) <- seq(1:length(matches))
matches

$`1`
[1] "blah@my.blah.com"

$`2`
[1] "yes@my.blah.com"   "stuff@my.blah.com"

$`3`
character(0)

【讨论】:

【参考方案3】:

str_extract 的选项

library(stringr)
str_extract_all(emails, "\\w+@my\\.blah\\.com")
#[[1]]
#[1] "blah@my.blah.com"

#[[2]]
#[1] "yes@my.blah.com"   "stuff@my.blah.com"

#[[3]]
#character(0)

如果我们只需要一个电子邮件地址

str_extract(emails, "\\w+@my\\.blah\\.com")
#[1] "blah@my.blah.com" "yes@my.blah.com"  NA          

【讨论】:

以上是关于从分号分隔的电子邮件向量中提取具有特定域的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

用于从切换列表中提取基于域的电子邮件的PHP脚本

在 MS Access 中以分号分隔的列表检索电子邮件地址的子查询

用分号正则表达式分隔的多封电子邮件[重复]

VBA 展望。尝试从电子邮件正文中提取特定数据并导出到 Excel

从主题中提取特定字符串格式以进行排序

Oracle - 将 XML 节点值提取到以分号作为分隔符的列表中