2012-06-17 23 views
3

我需要保留括號內的單詞並刪除以下字符串中的其他單詞。R:'not follow''not'正則表達式

(A(B(C)d)(E)F)

因此,我預計會是(((C))(E))。 要刪除a,b,d,f,我嘗試了'未遵循'正則表達式。

str <- "(a(b(c)d)(e)f)" 
gsub("([a-z]+)(?!\\))", "", str) #(sub. anything that isn't followed by a ")") 

該消息顯示我的正則表達式無效。正如我所看到的,正則表達式「(?!\))」第二部分的括號不正確。至於我的編輯器,第一個「(」與緊跟在後面的「)」相匹配,這不意味着是封閉括號(右邊的那個)。我可以從我的正則表達式中發現這個錯誤。你能告訴我什麼是錯的嗎?有沒有其他方法可以做到這一點?

+2

即使你有一個有效的正則表達式,我也不認爲你想要做的事會按照你的預期工作。請注意,「d」和「f」後跟一個「)」。您可能需要訴諸多個gsub。 – Dason

回答

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))" 
+0

查看+1。不錯的工作。 –

+0

解決了這個問題。謝謝。 – jackson

2

我@同意達誠的評論:

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上:-)