从分号分隔的电子邮件向量中提取具有特定域的电子邮件
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.com
、etc@etc.edu
和 me@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
【讨论】:
以上是关于从分号分隔的电子邮件向量中提取具有特定域的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
在 MS Access 中以分号分隔的列表检索电子邮件地址的子查询