【问题标题】:R gsub to extract emails from textR gsub 从文本中提取电子邮件
【发布时间】:2016-06-07 13:45:14
【问题描述】:

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

> 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. "

我做错了什么,如何获取这些电子邮件?谢谢!

【问题讨论】:

  • 使用 stringr str_extract"\\S+@[^\\s@.]+\\.\\S+" 之类的东西。可能还有很多其他的电子邮件提取正则表达式(只需搜索 SO)

标签: regex r gsub


【解决方案1】:

我们可以试试str_extract() 来自stringr 包:

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* 匹配任意数量的非空格字符。

【讨论】:

    【解决方案2】:

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

    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"
    

    【讨论】:

    • 如果您想提取多封电子邮件(继续搜索),请使用str_extract_all
    【解决方案3】:

    我们可以使用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 的帖子是关于 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-13
      • 2018-07-30
      • 1970-01-01
      • 2011-05-15
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多