Извлечь текст в скобках в 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"