R gsub для извлечения писем из текста

У меня есть переменная a, созданная readLines файла, который содержит несколько электронных писем. Я уже отфильтровал только те строки с символом @, и теперь изо всех сил пытаюсь получить электронные письма. Текст в моей переменной выглядит так:

> dput(a[1:5])
c("buenas tardes. excelente. por favor a: [email protected]", 
"[email protected] ", "Aprecio tu aporte , mi correo es [email protected] , Muchas Gracias", 
"gracias [email protected]", "Me apunto, muchas gracias mi dirección [email protected] me será de mucha utilidad. "
)

Из этого вопроса в SO я получил отправной точкой для извлечения электронных писем (ответ @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: [email protected]"           "[email protected] "                                                                          
[3] "Aprecio tu aporte , mi correo es [email protected] , Muchas Gracias"                           "gracias [email protected]"                                                                       
[5] "Me apunto, muchas gracias mi dirección [email protected] me será de mucha utilidad. "

Что я делаю неправильно и как я могу получить эти электронные письма? Спасибо!


person PavoDive    schedule 07.06.2016    source источник
comment
Используйте stringr str_extract с чем-то вроде "\\S+@[^\\s@.]+\\.\\S+". Может быть много других регулярных выражений для извлечения электронной почты (просто выполните поиск SO)   -  person Wiktor Stribiżew    schedule 07.06.2016


Ответы (3)


Мы можем попробовать пакет str_extract() from stringr:

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

[1] "[email protected]"              
[2] "[email protected]"             
[3] "[email protected]"             
[4] "[email protected]"      
[5] "[email protected]"

где \\S* соответствует любому количеству не пробельных символов.

person Psidom    schedule 07.06.2016

Из ответа, который вы разместили в своем вопросе,

library(stringr)
str_extract(a, '\\S+@\\S+|\\{(?:\\w+, *)+\\w+\\}@[\\w.-]+')
#[1] "[email protected]"               "[email protected]"              "[email protected]"              "[email protected]"      
#[5] "[email protected]"
person Sotos    schedule 07.06.2016
comment
Если вы хотите извлечь более одного электронного письма (продолжить поиск), используйте str_extract_all - person Dzidas; 18.09.2017

Мы можем использовать base R варианты, чтобы сделать это

unlist(regmatches(a, gregexpr("\\S+@\\S+", a)))
#[1] "[email protected]"    
#[2]"[email protected]" 
#[3] "[email protected]"             
#[4] "[email protected]"
#[5] "[email protected]"

Или, поскольку сообщение OP посвящено решению с gsub/sub

sub("(.*\\s+|^)(\\S+@\\S+).*", "\\2", a)
#[1] "[email protected]" 
#[2] "[email protected]" 
#[3] "[email protected]"             
#[4] "[email protected]"  
#[5] "[email protected]"
person akrun    schedule 07.06.2016