R gsub 从文本中提取电子邮件

R gsub to extract emails from text

我有一个变量 a,由包含一些电子邮件的文件的 readLines 创建。我已经只过滤了带有 @ 符号的那些行,现在正在努力获取电子邮件。我的变量中的文本如下所示:

> dput(a[1:5])
c("buenas tardes. excelente. por favor a: Saolonm@hotmail.com", 
"26.leonard@gmail.com ", "Aprecio tu aporte , mi correo es jcdavola31@gmail.com , Muchas Gracias", 
"gracias andrescarnederes@headset.cl", "Me apunto, muchas gracias mi dirección luciana.chavela.ecuador@gmail.com me será de mucha utilidad. "
)

从 SO 中的 this 问题我得到了一个提取电子邮件的起点(@Aaron Haurun 的回答),它略有修改(我在 @ 之前添加了一个 [\w.]地址之间带有 . 的电子邮件)在 regex101.com 中很好地提取电子邮件。但是,当我将它移植到 gsub:

时它失败了
> gsub("()(\w[\w.]+@[\w.-]+|\{(?:\w+, *)+\w+\}@[\w.-]+)()", 
       "\2", 
       a[1:5], 
       perl = FALSE) ## It doesn't matter if I use perl = TRUE

[1] "buenas tardes. excelente. por favor a: Saolonm@hotmail.com"           "26.leonard@gmail.com "                                                                          
[3] "Aprecio tu aporte , mi correo es jcdavola31@gmail.com , Muchas Gracias"                           "gracias andrescarnederes@headset.cl"                                                                       
[5] "Me apunto, muchas gracias mi dirección luciana.chavela.ecuador@gmail.com me será de mucha utilidad. "

我哪里做错了,我该如何获取这些电子邮件?谢谢!

根据您在问题中发布的答案,

library(stringr)
str_extract(a, '\S+@\S+|\{(?:\w+, *)+\w+\}@[\w.-]+')
#[1] "Saolonm@hotmail.com"               "26.leonard@gmail.com"              "jcdavola31@gmail.com"              "andrescarnederes@headset.cl"      
#[5] "luciana.chavela.ecuador@gmail.com"

我们可以尝试 stringr 包中的 str_extract()

str_extract(text, "\S*@\S*")

[1] "Saolonm@hotmail.com"              
[2] "26.leonard@gmail.com"             
[3] "jcdavola31@gmail.com"             
[4] "andrescarnederes@headset.cl"      
[5] "luciana.chavela.ecuador@gmail.com"

其中 \S* 匹配任意数量的非 space 字符。

我们可以使用 base R 选项来做到这一点

unlist(regmatches(a, gregexpr("\S+@\S+", a)))
#[1] "Saolonm@hotmail.com"    
#[2]"26.leonard@gmail.com" 
#[3] "jcdavola31@gmail.com"             
#[4] "andrescarnederes@headset.cl"
#[5] "luciana.chavela.ecuador@gmail.com"

或者作为 OP 的 post 是关于 gsub/sub

的解决方案
sub("(.*\s+|^)(\S+@\S+).*", "\2", a)
#[1] "Saolonm@hotmail.com" 
#[2] "26.leonard@gmail.com" 
#[3] "jcdavola31@gmail.com"             
#[4] "andrescarnederes@headset.cl"  
#[5] "luciana.chavela.ecuador@gmail.com"