我需要保留括号中的单词并删除以下字符串中的其他单词。
(A(B(C)d)(E)F)
所以我的期望是(((c))(e))。 要删除a,b,d,f,我尝试了“not follow by”正则表达式。
str <- "(a(b(c)d)(e)f)"
gsub("([a-z]+)(?!\\))", "", str) #(sub. anything that isn't followed by a ")" )
该消息显示我的正则表达式无效。正如我所看到的,正则表达式“(?!\))”第二部分中的括号不匹配。至于我的编辑器,第一个“(”与紧随其后的“)匹配”,这并不意味着是一个闭包(右边的那个)。我可以从我的正则表达式中弄清楚这个错误。你能告诉我实际上有什么问题吗?还有其他办法吗?
答案 0 :(得分:5)
分两步,使用positive lookaheads:
str1 <- gsub("\\([a-z](?=\\()", "\\(", str, perl=TRUE)
str1
# [1] "(((c)d)(e)f)"
str2 <- gsub("\\)[a-z](?=\\))", "\\)", str1, perl=TRUE)
str2
# [1] "(((c))(e))"
编辑:事实证明你甚至可以在一个中完成:
gsub("([\\(\\)])[a-z](?=\\1)", "\\1", str, perl=TRUE)
# [1] "(((c))(e))"
答案 1 :(得分:2)
我同意@Dason的评论:
st <- "(a(b(c)d)(e)f)"
while(grepl("\\([a-z]+\\(",st)) {
st <- sub("\\([a-z]+(\\(.+\\))[a-z]+\\)","\\1",st)
}
> st
[1] "(c)(e)"
写在我的iPad上: - )