【问题标题】: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 正确,这是我想要关注的。

【问题讨论】:

    标签: r 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          
        

        【讨论】:

          猜你喜欢
          • 2018-05-18
          • 1970-01-01
          • 1970-01-01
          • 2018-04-30
          • 1970-01-01
          • 1970-01-01
          • 2011-10-24
          • 2016-02-26
          • 2016-04-12
          相关资源
          最近更新 更多