【问题标题】:R how to detect if a string contains an email address and extract the email address and the previous 5 words?R如何检测字符串是否包含电子邮件地址并提取电子邮件地址和前5个单词?
【发布时间】:2019-04-05 00:50:58
【问题描述】:

R 正则表达式问题:我有一个职位和职位描述的数据框,我需要

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

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

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

【问题讨论】:

  • 这变成了一个问题,即您希望如何具体匹配特定的电子邮件地址模式,但这应该可以grepl('(.+@.+\\.com)|(.+@.+\\.gov)', teststr$job_description)
  • 每个模式都以.+ 开头,因为任何电子邮件地址都需要在@ 之前至少有一个字符

标签: r regex rstudio grepl


【解决方案1】:

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

Here is a demo

【讨论】:

  • 否决票的任何具体原因?如果您单击演示链接,则它符合指定条件。
  • 您的演示很有帮助!你能解释一下'?:'吗?
  • @Amazonian (?:...) 是一个非捕获组。它只是意味着该组的内容不会保存为组以供以后使用。我这样做的原因是我可以匹配 0 到 5 次后跟空格的单词。
【解决方案2】:

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

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

【讨论】:

  • 这一切都可以在一个模式中完成,不涉及拆分
  • @emsimpson92 如何在不涉及拆分的情况下以一种模式进行操作。拆分不是很实用,因为生成的 data.frame 会占用大量内存。
  • @Amazonian 我提供了一个答案,并举例说明了如何做到这一点。
【解决方案3】:

这是获取字符串的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

【讨论】:

  • 请记住,这将匹配电子邮件地址,例如 email@emailxcom。你想确保逃避你的.,但这与我的回答似乎并没有什么不同。
  • 啊是的很好,我认为应该是\\.(com|org|edu|gov)")
  • @jasbner 实际上,“在@asdf.gov 上关注我们”应该返回 FALSE(我在我的问题中犯了一个错误),因为紧接在 @ 前面的字符是空格而不是字符。我应该如何修改这个答案以确保电子邮件地址需要在 @ 之前有一个非空格字符?
  • 只需删除(\\w+) 之后的?。问号表示可选。
猜你喜欢
  • 2013-05-01
  • 2019-12-26
  • 2016-02-21
  • 2011-08-22
  • 2017-07-23
  • 2017-10-10
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多