Извлечь текст в скобках в R

два вопроса. У меня есть векторы текстовых данных, таких как

"a(b)jk(p)"  "ipq"  "e(ijkl)"

и хотите легко разделить его на вектор, содержащий текст вне скобок:

"ajk"  "ipq"  "e"

и вектор, содержащий текст в круглых скобках:

"bp"   ""  "ijkl"

есть ли простой способ сделать это? Дополнительная трудность заключается в том, что они могут быть довольно большими и иметь большое (неограниченное) количество скобок. Таким образом, я не могу просто захватить текст "pre/post" скобки и нужно более умное решение.

2 ответов


текст за скобками

> x <- c("a(b)jk(p)"  ,"ipq" , "e(ijkl)")
> gsub("\([^()]*\)", "", x)
[1] "ajk" "ipq" "e"  

текст в скобках

> x <- c("a(b)jk(p)"  ,"ipq" , "e(ijkl)")
> gsub("(?<=\()[^()]*(?=\))(*SKIP)(*F)|.", "", x, perl=T)
[1] "bp"   ""     "ijkl"

The (?<=\()[^()]*(?=\)) соответствует всем символам, которые присутствуют внутри скобок, а затем следующее (*SKIP)(*F) делает матч неудачным. Теперь он пытается выполнить шаблон, который был сразу после | символ против оставшейся строки. Итак, точка . соответствует всем символам, которые еще не пропущены. Замена всех сопоставленные символы с пустой строкой дадут только текст, присутствующий внутри ракеток.

> gsub("\(([^()]*)\)|.", "\1", x, perl=T)
[1] "bp"   ""     "ijkl"

это регулярное выражение будет захватывать все символы, которые присутствуют внутри скобок и соответствуют всем другим символам. |. или часть помогает сопоставить все оставшиеся символы, кроме захваченных. Поэтому, заменив все символы символами, присутствующими внутри группового индекса 1, вы получите желаемый результат.


на на qdapRegex пакета я был рожден для этого:

Сначала мы получим и загрузим пакет через Пакман

if (!require("pacman")) install.packages("pacman")
pacman::p_load(qdapRegex)

## тогда мы можем использовать его для удаления и извлечения деталей:

x <-c("a(b)jk(p)", "ipq", "e(ijkl)")

rm_round(x)

## [1] "ajk" "ipq" "e" 

rm_round(x, extract=TRUE)

## [[1]]
## [1] "b" "p"
## 
## [[2]]
## [1] NA
## 
## [[3]]
## [1] "ijkl"

конденсироваться b и p использование:

sapply(rm_round(x, extract=TRUE), paste, collapse="")

## [1] "bp"   "NA"   "ijkl"