首页 > 解决方案 > 如何从字符串中提取括号到新列中

问题描述

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

假设我有一个字符串

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)]" 

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

标签: rregexsplit

解决方案


您可以使用

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 演示正则表达式演示

图案细节

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

paste0("[", unlist(matches),"]")部分用方括号括起火柴。


推荐阅读