首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R分裂问题中使用rebus的Regex?

R分裂问题中使用rebus的Regex?
EN

Stack Overflow用户
提问于 2018-09-25 07:46:15
回答 3查看 180关注 0票数 2

我有以下字符串模式:

Name_session_id:Owner:UUID,但有时它可能只是名称:Owner:UUID。

例如:

代码语言:javascript
复制
John_1:David:enfl43erl34r345

代码语言:javascript
复制
John:David:enfl43erl34r345

我希望使用stringrrebus来构建如下所示的数据框架:

代码语言:javascript
复制
Name   Session   Owner   UUID
John   1         David   enfl43erl34r345
John   NA        David   enfl43erl34r345

请建议如何做到这一点,下面是我迄今为止对模式所做的工作:

代码语言:javascript
复制
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))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-25 08:13:14

问题在于第一个one_or_more(WRD),它也匹配_,下面的_\d?甚至没有尝试,因为\w+抓取了所有的字母、数字和下划线。

将第一个one_or_more(WRD)替换为one_or_more(ALNUM),只捕获第1组中的1+字母或数字:

代码语言:javascript
复制
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))

代码语言:javascript
复制
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))

但是,我认为你应该用

代码语言:javascript
复制
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),您可以用一个可选的组包装这两个后续的模式,同时使其中的模式成为必需的。

票数 2
EN

Stack Overflow用户

发布于 2018-09-25 08:34:35

玩一些正则表达式,您可以完全依赖于stringr::str_extract()

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2018-09-25 08:15:32

不使用rebus,但是这里有一个基本的没有废话的方法:

数据:

代码语言:javascript
复制
df1 <-
data.frame(strings = c("John_1:David:enfl43erl34r345", "John:David:enfl43erl34r345"), stringsAsFactors = F)

代码:

代码语言:javascript
复制
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")

结果:

代码语言:javascript
复制
#  Name Session Owner            UUID
#1 John       1 David enfl43erl34r345
#2 John    <NA> David enfl43erl34r345
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52493088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档