Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中提取括号中的文本_R_String_Text_Vector_Stringr - Fatal编程技术网

在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绝对是一个组合良好的软件包。