【问题标题】:How to extract bracket from string into new columns如何从字符串中提取括号到新列中
【发布时间】:2020-06-08 16:33:22
【问题描述】:

我需要将字符串中的信息导出到不同的列中。 更具体地说是字符串中括号的内容;

假设我有一个字符串

a <- "2xExp [K89; K96]; 1xExp [N-Term]; 2xNum [S87(100); S93(100)]"

我要输出的是一个带有括号内容的向量,如果有逗号将它们保存为单独的括号字符串,并删除括号。

例如

tmp <- function(a)

结果

tmp
"[K89]" , "[K96]", "[N-Term]", "[S87]", "[S93]"

到目前为止我的方法:

  pattern <- "(\\[.*?\\])"
  hits <- gregexpr(pattern, a)
  matches <- regmatches(a, hits)
  unlisted_matches <- unlist(matches)

结果

"[K89; K96]" "[N-Term]" "[S87(100); S93(100)]" 

这确实给了我括号,但仍然没有拆分条款。并且出于任何原因,我无法有效地分离“;”条款。

【问题讨论】:

  • 分多个步骤而不是使用一个怪物正则表达式模式在技术上和精神上都更便宜。您当前的模式是很好的第一步。尽管如此,我还是把它当作一个挑战,这是我能做的最好的事情(在合理的时间内):regex101.com/r/LTtcJv/3
  • 使用 PCRE \G 运算符(实际上,它是一个 anchor^$),这对于我的答案中的单个正则表达式来说是完全可以的.如果字符串的格式是一致的,那么像这样的单个正则表达式的诡计就足够恕我直言了。

标签: r regex split


【解决方案1】:

这是使用 tidyverse 的一种方法:

a <- "2xExp [K89; K96]; 1xExp [N-Term]; 2xNum [S87(100); S93(100)]"

library(tidyverse)
a %>% 
  # extract between square, brackets, not keeping brackets, and unlist
  str_extract_all("(?<=\\[).*?(?=\\])") %>% 
  unlist() %>%  
  # remove round brackets and content
  str_replace_all("\\(.*?\\)", "") %>%
  # split by ";" and unlist
  str_split("; ") %>%
  unlist() %>%
  # put the brackets back
  str_c("[",.,"]")
#> [1] "[K89]"    "[K96]"    "[N-Term]" "[S87]"    "[S93]"

【讨论】:

    【解决方案2】:

    你可以使用

    a <- "2xExp [K89; K96]; 1xExp [N-Term]; 2xNum [S87(100); S93(100)]"
    pattern <- "(?:\\G(?!^)(?:\\([^()]*\\))?\\s*;\\s*|\\[)\\K[^][;()]+"
    matches <- regmatches(a, gregexpr(pattern, a, perl=TRUE))
    unlisted_matches <- paste0("[", unlist(matches),"]")
    unlisted_matches
    ## => [1] "[K89]"    "[K96]"    "[N-Term]" "[S87]"    "[S93]"   
    

    请参阅R demoregex demo

    模式详情

    • (?:\G(?!^)(?:\([^()]*\))?\s*;\s*|\[) - 前一个成功匹配的结尾 (\G(?!^)) 后跟圆括号内的任何子字符串(可选,请参阅 (?:\([^()]*\))?),然后是 ;,其中包含可选的 0+ 空格(请参阅\s*;\s*)或[ char
    • \K - 匹配重置运算符丢弃所有匹配的文本
    • [^][;()]+ - 除了[];() 之外的一个或多个字符。

    paste0("[", unlist(matches),"]") 部分用方括号括起匹配项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多