Извлечение электронной почты с определенным доменом из вектора электронной почты, разделенного точкой с запятой - PullRequest
1 голос
/ 26 мая 2019

Рассмотрим следующий вектор писем:

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 адрес электронной почты, если он существует.Я хотел бы вернуть этот адрес электронной почты для каждого пользователя в виде символьного вектора и вернуть 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 ]

2 голосов
/ 26 мая 2019

Вот один подход, использующий 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)
2 голосов
/ 26 мая 2019

Опция с 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          
2 голосов
/ 26 мая 2019

Мы могли бы разделить строки на ";", а затем использовать grep с pattern, заканчивающимся "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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...