【问题标题】:Extract text in parentheses in R在R中提取括号中的文本
【发布时间】:2015-05-11 09:33:00
【问题描述】:

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

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

并希望轻松地将其分成包含括号外文本的向量:

"ajk"  "ipq"  "e"

和一个包含括号内文本的向量:

"bp"   ""  "ijkl"

有什么简单的方法可以做到这一点吗?另一个困难是这些可能会变得非常大并且有大量(无限)括号。因此,我不能简单地抓住括号中的文本“前/后”,需要一个更智能的解决方案。

【问题讨论】:

标签: r string text vector stringr


【解决方案1】:

括号外的文字

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

(?&lt;=\\()[^()]*(?=\\)) 匹配括号内的所有字符,然后后面的(*SKIP)(*F) 使匹配失败。现在它尝试针对剩余的字符串执行 | 符号之后的模式。所以点. 匹配所有尚未跳过的字符。用空字符串替换所有匹配的字符将只给出球拍内的文本。

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

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

【讨论】:

  • 我认为这是偶然的,因为投票没有意义。提取很酷,因为您在没有pasteing 的情况下提取并组合在一起。 +1
  • @TylerRinker 是的,有人生我的气,所以他对我的答案投了 4 票反对票,最低分数为 1。我的错。
  • @TylerRinker 你能提供 qdapRegex 包的链接吗?
  • 至第一条评论“琐碎”:-(至第二条...当然github.com/trinker/qdapRegex我也在我的答案中链接了。它也是一个 CRAN 包。
  • @TylerRinker qdapRegex 绝对是一个很好的组合包。
【解决方案2】:

我维护的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"

【讨论】:

  • regmatches(x,gregexpr("(?&lt;=\\().+?(?=\\))",x,perl=TRUE)) 用于基础版本的regmatchesregmatches(x,gregexpr("(?&lt;=\\)|^).+?(?=\\(|$)",x,perl=TRUE)) 用于反向。
  • @thelatemail 这值得自己回答。
猜你喜欢
  • 1970-01-01
  • 2020-09-14
  • 2016-08-31
  • 1970-01-01
  • 2010-09-27
  • 2021-11-24
  • 2012-01-26
  • 1970-01-01
  • 2021-05-25
相关资源
最近更新 更多