在R中用括号中的文本提取

时间:2015-03-10 02:53:25

标签: r string text vector stringr

两个相关问题。我有文本数据的向量,如

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

并希望轻松将其分隔为包含括号内的文本的向量:

"ajk"  "ipq"  "e"

和包含括号中的文本的向量:

"bp"   ""  "ijkl"

有没有简单的方法可以做到这一点?另一个困难是这些可能变得非常大并且具有大(无限)数量的括号。因此,我不能简单地抓取文字" pre / post"括号,需要一个更智能的解决方案。

2 个答案:

答案 0 :(得分:11)

括号外的文字

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

(?<=\\()[^()]*(?=\\))匹配括号内的所有字符,然后以下(*SKIP)(*F)使匹配失败。现在它尝试执行紧跟剩余字符串的|符号之后的模式。因此,点.匹配所有尚未跳过的字符。用空字符串替换所有匹配的字符只会给出球拍内的文字。

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

此正则表达式将捕获括号内的所有字符并匹配所有其他字符。 |.或部分有助于匹配捕获的所有剩余字符。因此,通过将所有字符替换为组索引1中存在的字符,将为您提供所需的输出。

答案 1 :(得分:5)

我维护的qdapRegex package中的rm_round函数就是为此而生的:

首先我们通过 pacman

获取并加载包
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"

要缩小bp,请使用:

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

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