我有以下字符串模式:
Name_session_id:Owner:UUID,但有时它可能只是名称:Owner:UUID。
例如:
John_1:David:enfl43erl34r345或
John:David:enfl43erl34r345我希望使用stringr和rebus来构建如下所示的数据框架:
Name Session Owner UUID
John 1 David enfl43erl34r345
John NA David enfl43erl34r345请建议如何做到这一点,下面是我迄今为止对模式所做的工作:
capture(one_or_more(WRD)) %R%
optional("_") %R%
capture(optional(DGT)) %R%
":" %R%
capture(one_or_more(WRD)) %R%
":" %R%
capture(one_or_more(WRD))发布于 2018-09-25 08:13:14
问题在于第一个one_or_more(WRD),它也匹配_,下面的_和\d?甚至没有尝试,因为\w+抓取了所有的字母、数字和下划线。
将第一个one_or_more(WRD)替换为one_or_more(ALNUM),只捕获第1组中的1+字母或数字:
capture(one_or_more(ALNUM)) %R%
optional("_") %R%
capture(optional(DGT)) %R%
":" %R%
capture(one_or_more(WRD)) %R%
":" %R%
capture(one_or_more(WRD))或者,让它懒得使用lazy(one_or_more(WRD))
capture(lazy(one_or_more(WRD))) %R%
optional("_") %R%
capture(optional(DGT)) %R%
":" %R%
capture(one_or_more(WRD)) %R%
":" %R%
capture(one_or_more(WRD))但是,我认为你应该用
capture(one_or_more(ALNUM)) %R%
optional(
group("_" %R%
capture(one_or_more(DGT)))) %R%
":" %R%
capture(one_or_more(WRD)) %R%
":" %R%
capture(one_or_more(WRD))它将创建一个类似于([[:alnum:]]+)(?:_([\d]+))?:([\w]+):([\w]+)的正则表达式。也就是说,您可以使用_作为一个可选的字符,后面跟着一个可选的one_or_more(DGT),您可以用一个可选的组包装这两个后续的模式,同时使其中的模式成为必需的。
发布于 2018-09-25 08:34:35
玩一些正则表达式,您可以完全依赖于stringr::str_extract()
library(stringr)
data.frame(
Name = str_extract(data, "^[^:_]+"),
Session = str_extract(data, "(?<=_).*?(?=:)"),
Owner = str_extract(data, "(?<=:).*(?=:)"),
UUID = str_extract(data, "[^:]*$"),
stringsAsFactors = FALSE
)
Name Session Owner UUID
1 John 1 David enfl43erl34r345
2 John <NA> David enfl43erl34r345发布于 2018-09-25 08:15:32
不使用rebus,但是这里有一个基本的没有废话的方法:
数据:
df1 <-
data.frame(strings = c("John_1:David:enfl43erl34r345", "John:David:enfl43erl34r345"), stringsAsFactors = F)代码:
fun1 <- function(x) {
ans <- strsplit(x, "^[^:]+\\K_(?=\\d)", perl = T)
ans <- lapply(ans, strsplit, ":")
ans <- unlist(ans)
if(length(ans) == 3) { ans <- append(ans, NA, 1) }
return(ans)
}
result <- as.data.frame(t(apply(df1, 1, fun1)), stringsAsFactors = F)
names(result) = c("Name", "Session", "Owner", "UUID")结果:
# Name Session Owner UUID
#1 John 1 David enfl43erl34r345
#2 John <NA> David enfl43erl34r345https://stackoverflow.com/questions/52493088
复制相似问题