提取特定子字符串(电子邮件地址)

7
我将尝试从如下变量中提取一些特定的内容:

该变量的形式如下:

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

(该变量有数百个观测值)

我最终想要创建第二个变量,以获取他们的电子邮件来产生以下输出:

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

我该如何做到这一点?有没有我可以使用的特定软件包?还是我需要创建一个结合grep和substr的功能函数?
4个回答

18

这些看起来就像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 帮助页面。


3
什么? :O [你是如何找到这些函数的?!] - zx8754
@zx8754 是的,那里有很多疯狂的函数。我想我是通过帮助一个很久以前在这个网站上尝试对这些集合进行子集操作的人而学到了这个函数。它们有一些奇怪的行为。 - MrFlick

3
您可以查找模式“任何内容 **,然后 < 任何内容 >”,并将该模式替换为括号中的部分,由\1(和额外的 \ 转义)表示。
sub('.*<(.*)>.*', '\\1', v1)
# [1] "personsemail@email.com" "person2@email.com" 

"anything"实际上指的是除换行符之外的任何东西


3
stringr中的str_extract提供了一种方法。
library(stringr)
str_extract(v1, "(?<=\\<)[^>]+")
#[1] "personsemail@email.com" "person2@email.com"  

2
你可以使用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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接