首页 > 解决方案 > R如何检测字符串是否包含电子邮件地址并提取电子邮件地址和前5个单词?

问题描述

R正则表达式问题:我有一个职位和职位描述的data.frame,我需要

1) 检查职位描述是否包含电子邮件地址(可以是 .org、.edu、.gov、.com),以及

2)提取电子邮件地址和电子邮件地址前面的5个单词

数据集可以包含可以以 .edu、.com 等结尾的 Web url,还可以包含返回。基本上,我希望将电子邮件地址识别为具有 [letters/numbers]@[letters/numbers](.org、.edu、.gov、.com 以及电子邮件可以以其他任何结尾)的任何内容

这是一个示例数据集:

    teststr = data.frame(job_title = c(1:8),
                 job_description = c('please send your resumes to adsf@dsf.com apply now!',
                                   'asdfa@asdf.com/adsf asdf',
                                   'visit us at sfds@adfa',
                                   'apply now',
                                   'follow us on @asdf.gov',
                                   'asdfa.gov',
                                   '.com',
                                   ''))



> teststr
  job_title                                     job_description
1         1 please send your resumes to adsf@dsf.com apply now!
2         2                            asdfa@asdf.com/adsf asdf
3         3                               visit us at sfds@adfa
4         4                                           apply now
5         5                              follow us on @asdf.gov
6         6                                           asdfa.gov
7         7                                                .com
8         8                                                    

我尝试了(1),但得到了错误的答案

    grepl('(*@.+\\.com)|(*@\\S\\.gov)', teststr$job_description)

(1) 的正确结果应该是

      TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

标签: rregexrstudiogrepl

解决方案


以下模式应与大多数电子邮件地址格式匹配:

([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

要捕获前面的五个单词,请在模式上拆分字符串,然后再在空格上拆分,并捕获最多 6 个(包括)元素。


推荐阅读