use*_*329 6 string text r vector stringr
两个相关的问题.我有文本数据的向量,如
"a(b)jk(p)" "ipq" "e(ijkl)"
Run Code Online (Sandbox Code Playgroud)
并希望将其轻松分离为包含括号内的文本的向量:
"ajk" "ipq" "e"
Run Code Online (Sandbox Code Playgroud)
和包含括号中的文本的向量:
"bp" "" "ijkl"
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来做到这一点?另一个困难是这些可能变得非常大并且具有大(无限)数量的括号.因此,我不能简单地在括号中"预先/发布"文本并需要更智能的解决方案.
Avi*_*Raj 11
括号外的文字
> x <- c("a(b)jk(p)" ,"ipq" , "e(ijkl)")
> gsub("\\([^()]*\\)", "", x)
[1] "ajk" "ipq" "e"
Run Code Online (Sandbox Code Playgroud)
括号内的文字
> x <- c("a(b)jk(p)" ,"ipq" , "e(ijkl)")
> gsub("(?<=\\()[^()]*(?=\\))(*SKIP)(*F)|.", "", x, perl=T)
[1] "bp" "" "ijkl"
Run Code Online (Sandbox Code Playgroud)
的(?<=\\()[^()]*(?=\\))匹配所有这些存在于括号内,然后下面的字符(*SKIP)(*F)使得匹配失败.现在它尝试执行刚刚|符号对剩余字符串的模式.因此,点.匹配所有尚未跳过的字符.用空字符串替换所有匹配的字符将仅提供球拍内的文本.
> gsub("\\(([^()]*)\\)|.", "\\1", x, perl=T)
[1] "bp" "" "ijkl"
Run Code Online (Sandbox Code Playgroud)
此正则表达式将捕获括号内的所有字符并匹配所有其他字符.|.或部分有助于匹配除捕获的其余字符之外的所有剩余字符.因此,通过将所有字符替换为组索引1中存在的字符,将为您提供所需的输出.
我维护rm_round的qdapRegex包中的函数就是为此而生的:
首先,我们将通过pacman获取并加载包
if (!require("pacman")) install.packages("pacman")
pacman::p_load(qdapRegex)
Run Code Online (Sandbox Code Playgroud)
##然后我们可以用它来删除和提取你想要的部分:
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"
Run Code Online (Sandbox Code Playgroud)
凝聚b和p使用:
sapply(rm_round(x, extract=TRUE), paste, collapse="")
## [1] "bp" "NA" "ijkl"
Run Code Online (Sandbox Code Playgroud)