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

问题描述

我想使用 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 AM\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先生

留言:(空白)

标签: rregexdata.tablegsub

解决方案


您可以使用 Base Rstrcapture功能:

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

推荐阅读