Как извлечь скобку из строки в новые столбцы - PullRequest
2 голосов
/ 25 февраля 2020

Мне нужно экспортировать информацию из строки в разные столбцы. Точнее, содержимое скобок внутри строки:

Допустим, у меня есть строка

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

Это дает мне скобки, но все же не разделяет термины. И по любой причине я не могу эффективно отделить ";" условия.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Вот способ использования тидиверса:

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]"
1 голос
/ 25 февраля 2020

Вы можете использовать

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 и демонстрацию regex .

Сведения о шаблоне

  • (?:\G(?!^)(?:\([^()]*\))?\s*;\s*|\[) - либо конец предыдущего успешного совпадения (\G(?!^)) с любой подстрокой в ​​круглых скобках (необязательно, см. (?:\([^()]*\))?), а затем ;, заключенный в необязательные 0+ пробелов (см. \s*;\s*) или [ char
  • \K - оператор сброса совпадений, отбрасывающий весь найденный текст
  • [^][;()]+ - один или несколько символов кроме [, ], ;, ( и ).

Часть paste0("[", unlist(matches),"]") заключает спички в квадратные скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...