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

R how to detect if a string contains an email address and extract the email address and the previous 5 words?

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

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

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

数据集可以包含以 .edu、.com 等结尾的网址,还可以包含 returns。基本上,我希望将电子邮件地址识别为具有 [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

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

([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 个(含)元素。

这应该适合您。 (?:\w+ ){0,5}\w+@\w+\.(?:com|gov|edu|org)

Here is a demo

这是一个获取字符串的 stringr 示例。如果你只需要 T/F 你可以做 grepl.

library(stringr)
str_extract(teststr$job_description,"(\w+ ){0,5}(\w+)?@\w+\.(com|org|edu|gov)")
# [1] "please send your resumes to adsf@dsf.com" "asdfa@asdf.com"                          
# [3] NA                                         NA                                        
# [5] "follow us on @asdf.gov"                   NA                                        
# [7] NA                                         NA 


grepl("(\w+ ){0,5}(\w+)?@\w+\.(com|org|edu|gov)",teststr$job_description)
# [1]  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE