【问题标题】:Extracting a certain substring (email address)提取某个子字符串(电子邮件地址)
【发布时间】:2019-12-26 02:47:11
【问题描述】:

我正在尝试从一个看起来像这样的变量中提取一些特定值:

v1 <- c("Persons Name <personsemail@email.com>","person 2 <person2@email.com>")

(这个变量有数百个观察值)

我想最终制作第二个变量来提取他们的电子邮件以提供此输出:

v2 <- c("personsemail@email.com", "person2@email.com")

我该怎么做?我可以使用某个包吗?还是我需要制作一个包含grepsubstr 的函数?

【问题讨论】:

    标签: r regex substring


    【解决方案1】:

    str_extract 的一个选项来自stringr

    library(stringr)
    str_extract(v1, "(?<=\\<)[^>]+")
    #[1] "personsemail@email.com" "person2@email.com"  
    

    【讨论】:

      【解决方案2】:

      您可以查找模式“anything**, then , then any”,并用括号之间的部分替换该模式,由 \1 表示(以及一个额外的 \ 用于转义)。

      sub('.*<(.*)>.*', '\\1', v1)
      # [1] "personsemail@email.com" "person2@email.com" 
      

      **“任何东西”实际上意味着除了换行符之外的任何东西

      【讨论】:

        【解决方案3】:

        那些看起来像 R 可能所说的“人”。有一个as.person() 函数可以拆分电子邮件地址。例如

        v1 <- c("Persons Name <personsemail@email.com>","person 2 <person2@email.com>")
        unlist(as.person(v1)$email)
        # [1] "personsemail@email.com" "person2@email.com"
        

        有关详细信息,请参阅?person 帮助页面。

        【讨论】:

        • 哇哇哇哇哇哇? :O [你是怎么找到这些函数的?!]
        • @zx8754 是的,那里有很多疯狂的功能。我想我是通过帮助很久以前在这个网站上尝试对这些集合进行子集化的人了解到这一点的。他们有一些奇怪的行为。
        【解决方案4】:

        您可以使用regexpr 查找类似于电子邮件的模式。如果找到匹配项,请使用substring 提取相关部分。起始位置和匹配长度由regexpr提供

        inds = regexpr(pattern = "<(.*@.*\\..*)>", v1)
        ifelse(inds > 1,
               substring(v1, inds + 1, inds + attr(inds, "match.length") - 2),
               NA)
        #[1] "personsemail@email.com" "person2@email.com"
        

        【讨论】:

          猜你喜欢
          • 2017-10-10
          • 1970-01-01
          • 2013-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-12
          • 1970-01-01
          相关资源
          最近更新 更多