在R中提取括号中的文本
两个相关的问题。我有文本数据向量,比如在R中提取括号中的文本,r,string,text,vector,stringr,R,String,Text,Vector,Stringr,两个相关的问题。我有文本数据向量,比如 "a(b)jk(p)" "ipq" "e(ijkl)" 并希望轻松地将其分离为包含括号外文本的向量: "ajk" "ipq" "e" "bp" "" "ijkl" 以及包含括号内文本的向量: "ajk" "ipq" "e" "bp" "" "ijkl" 有什么简单的方法可以做到这一点吗?另一个困难是,它们可能变得相当大,并且有大量(无限)的括号。因此,我不能简单地抓住括号中的文本“pre/post”,而需要一个更智能的解决
"a(b)jk(p)" "ipq" "e(ijkl)"
并希望轻松地将其分离为包含括号外文本的向量:
"ajk" "ipq" "e"
"bp" "" "ijkl"
以及包含括号内文本的向量:
"ajk" "ipq" "e"
"bp" "" "ijkl"
有什么简单的方法可以做到这一点吗?另一个困难是,它们可能变得相当大,并且有大量(无限)的括号。因此,我不能简单地抓住括号中的文本“pre/post”,而需要一个更智能的解决方案 括号外的文本
> 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"
这个正则表达式将捕获括号内的所有字符,并匹配所有其他字符
|。
或part有助于匹配除捕获字符外的所有剩余字符。因此,使用组索引1中的字符替换所有字符将获得所需的输出。I Maintent中的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"
这篇文章可能很有用:
regmatches(x,gregexpr()(?@thelatemail应该有自己的答案。我认为这是偶然的,因为否决票没有任何意义。提取很酷,因为您提取并组合在一起时没有粘贴+1@TylerRinker是的,有人生我的气,所以他对我的答案投了4张反对票,最低分是1。我的错。@Tylerinker,你能提供吗qdapRegex软件包的链接?第一条评论“petty”:(第二条…当然我在回答中也链接了。它也是一个CRAN软件包。@Tylerinker qdapRegex绝对是一个组合良好的软件包。