【问题标题】:Best method to extract the first instance of a string between specified keywords using data.table使用 data.table 在指定关键字之间提取字符串的第一个实例的最佳方法
【发布时间】:2019-08-15 22:19:58
【问题描述】:

我想使用 data.table 提取某些单词后面的字符串。

主题: 从到: 日期: 消息:

预期输入: 主题:欢迎 \r\n发件人:(Jane Doe) JaneDoe@emaildomain.com\r\n收件人: (Foo Bar) Foo.Bar@emaildomain.com\r\n日期:2019 年 1 月 1 日上午 7:01:32\r\n\r\n 从我的 iPhone 发送\r\n\r\n开始转发消息: \r\n\r\n发件人:X先生

我尝试了一些函数,但无法让代码仅提取字符串的第一个实例而忽略后续字符串。我也遇到了仅捕获我正在寻找的部分的问题。

library(data.table)

x<- as.data.table("Subject: Welcome \r\nFrom: (Jane Doe) JaneDoe@emaildomain.com\r\nTo: 
                  (Foo Bar) Foo.Bar@emaildomain.com\r\nDate: 1/1/2019 7:01:32 AM\r\n\r\n Sent from my iPhone\r\n\r\nBegin forwarded message:\r\n\r\nFrom: Mr. X <xxx@gmail.com","x1")

x[, Subject := sub('^.*Subject:\\s*|\\s*From:.*$', '', V1) ][]
x[, From := sub('^.*From:\\s*|\\s*To:.*$', '', V1) ][]
x[, To := sub('^.*To:\\s*|\\s*Date:.*$', '', V1) ][]
x[, Message := sub('^.*PM|AM\\s*|\\s*.*$', '', V1) ][]

x

当前结果: V1 主题:欢迎 \r\n发件人:(Jane Doe) JaneDoe@emaildomain.com\r\n收件人:\n (Foo Bar) Foo.Bar@emaildomain.com\r\n日期:2019 年 1 月 1 日 7:01:32 AM\r\n\r\n 从我的 iPhone 发送\r\n\r\n开始转发消息:\r\n\r\n发件人:X 先生

发件人:X先生

发件人:X先生

消息:(空白)

【问题讨论】:

  • 你能告诉你预期的输出吗

标签: r regex data.table gsub


【解决方案1】:

您可以使用 Base R strcapture 函数:

prot = data.frame(setNames(replicate(4,character()),
               c("Subject","From","To","Date")),stringsAsFactors = F) 

patt = "Subject:\\s*(.*?)\\s*From:\\s*(.*?)\\s*To:\\s*(.*?)\\s*Date:\\s*(.*(?:A|P)M)"

strcapture(patt,x$V1,prot)

  Subject                               From                                To                Date
1 Welcome (Jane Doe) JaneDoe@emaildomain.com (Foo Bar) Foo.Bar@emaildomain.com 1/1/2019 7:01:32 AM

【讨论】:

  • 非常感谢。这正是我所需要的。
【解决方案2】:

使用gsub删除\r\n后,我们可以使用tidyr::extract将数据分成4列。

library(dplyr)

x %>%
   mutate(V1 = gsub("\r|\n", "", V1)) %>%
   tidyr::extract(V1, into = c("Subject", "From", "To", "Date"), 
          regex = ".*Subject:(.*)From:(.*)To:(.*)Date:(.*)A|PM.*")

#   Subject                                 From                                  To
#1  Welcome   (Jane Doe) JaneDoe@emaildomain.com   (Foo Bar) Foo.Bar@emaildomain.com

#                Date
# 1  1/1/2019 7:01:32 

【讨论】:

    猜你喜欢
    • 2019-05-06
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多