提取某个子字符串(电子邮件地址)
Posted
技术标签:
【中文标题】提取某个子字符串(电子邮件地址)【英文标题】: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")
我该怎么做?我可以使用某个包吗?还是我需要制作一个包含grep
和substr
的函数?
【问题讨论】:
【参考方案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"
【讨论】:
以上是关于提取某个子字符串(电子邮件地址)的主要内容,如果未能解决你的问题,请参考以下文章