【问题标题】:Extract Original Email Sender from Text Body Using Regex in R使用 R 中的正则表达式从文本正文中提取原始电子邮件发件人
【发布时间】:2020-03-25 11:51:06
【问题描述】:

我已将收件箱提取到 csv,每封电子邮件的正文都以以下格式输出:

"From: Name email@email.co.uk mailto:Name@email.co.uk text text text"

这些几乎都是长链电子邮件,但我需要一种方法来获取原始发件人。

目前,我一直在使用正则表达式模式从每个文本正文中抓取电子邮件,然后抓取该列表中的最后一封电子邮件:

list_emails = unlist(regmatches(text, gregexpr("([_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4}))", 
                                          text, ignore.case = TRUE)))

# The last item in that list is the last one found within the body of the email and our likely original sender
list_emails[length(list_emails)]

如果原始电子邮件的签名中有他们的地址,但如果没有,则获取最后一个复制的人(抄送)。

我想要编辑它以仅获取以字符串模式“发件人:”开头的电子邮件,然后我可以获取此新列表中的最后一项。这将是获取原始发件人的最快方式。

有没有办法编辑我的原始模式来完成这个?

【问题讨论】:

    标签: r regex stringr


    【解决方案1】:

    您可以使用 PCRE 正则表达式,例如

    text <- "From: Name email@email.co.uk mailto:Name@email.co.uk text text text"
    rx <- "From:.*\\K\\b[_a-z0-9-]+(?:\\.[_a-z0-9-]+)*@[a-z0-9-]+(?:\\.[a-z0-9-]+)*\\.[a-z]{2,4}\\b"
    unlist(regmatches(text, gregexpr(rx, text, ignore.case=TRUE, perl=TRUE)))
    ## => [1] "Name@email.co.uk"
    

    请参阅 R demo onlineregex demo

    注意perl=TRUE 参数的使用。主要区别是在开头添加了From:.*\K\b,在末尾添加了\b

    模式详情

    • From: - 文字字符串
    • .* - 除换行符以外的任何 0+ 个字符,尽可能多
    • \K - 一个匹配重置操作符,在整个匹配内存缓冲区中丢弃所有匹配的文本
    • \b - 单词边界(这也意味着电子邮件不能以 - 开头)
    • [_a-z0-9-]+ - 1+ 字母、数字、_-
    • (?:\.[_a-z0-9-]+)* - 0 次或多次重复 . 后跟 1+ 字母、数字、_-
    • @ - 一个 @ 字符
    • [a-z0-9-]+ - 1+ 个字母、数字或 -
    • (?:\.[a-z0-9-]+)* - 0 次或多次重复 . 后跟 1+ 字母、数字或 -
    • \. - 一个点
    • [a-z]{2,4} - 两个、三个或四个字母
    • \b - 单词边界。

    【讨论】:

    • 一如既往,很好的解释@WiktorStribizew!顺便提一下,gmail邮箱可以包含+符号danq.me/2017/09/26/gmail-plus
    • 这很好,几乎解决了这个问题。一个问题是格式为“name.surname@email.com”的电子邮件,因为它只获取 surname@email.com。你能帮忙做一下这个细微的调整吗?
    • @RHaigh 只有当您可以定义电子邮件开始位置上下文时,您才能解决该问题。它总是以一些字符开头吗?喜欢mailto: 子字符串?
    • 所以我要查找的上下文始终是:发件人:name.surname@email.com 或发件人:longname@email.com
    • 不,我的意思是电子邮件部分的左侧上下文。见this R demothis regex demo
    【解决方案2】:

    你可以使用这个正则表达式

    From:.*?([\w_+.]+@[\w_.]+).+?mailto:.*?([\w_+.]+@[\w_.]+)
    

    第 1 组包含From: 之后的电子邮件
    第 2 组包含mailto: 之后的第二封电子邮件

    Demo

    这个也可以:

    ([\w_+.]+)@([\w_.]+)
    

    第 1 组包含该行中的第一封电子邮件
    第 2 组包含该行中的第二封电子邮件

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 2018-11-04
      • 2018-08-11
      • 2020-07-20
      相关资源
      最近更新 更多