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

时间:2019-05-26 03:53:37

标签: r regex

请考虑以下电子邮件矢量:

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电子邮件地址(如果存在)。我想为每个用户返回此电子邮件地址作为字符向量,并在不存在NA电子邮件地址的情况下返回my.blah.com

因此,输出应为

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正确,这是我要关注的重点。

3 个答案:

答案 0 :(得分:2)

我们可以在";"上拆分字符串,然后将greppattern结尾的"my.blah.com"一起使用,并返回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)

答案 1 :(得分:2)

这是使用id ----------- 1 2 3 4 5 6 的一种方法,与您尝试做的事情类似:

regmatches

答案 2 :(得分:2)

带有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