使用 data.table 在指定关键字之间提取字符串的第一个实例的最佳方法

Best method to extract the first instance of a string between specified keywords using data.table

我想使用 data.table 提取特定单词后的字符串。

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

预期输入: 主题:欢迎 \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 从我的 iPhone\r\n\r\nBegin 转发的消息发送:\r\n\r\nFrom: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\nFrom: (Jane Doe) JaneDoe@emaildomain.com\r\nTo: \n (Foo Bar) Foo.Bar@emaildomain.com\r\nDate: 1/1/2019 7:01:32 AM\r\n\r\n 从我的 iPhone\r\n\r\nBegin 转发的消息发送:\r\n\r\nFrom:X 先生

发件人:X先生

发件人:X先生

消息:(空白)

您可以使用 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

在使用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