5

次の文字列で、角かっこで囲まれた単語を保持し、他の単語を削除する必要がありました。

(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 ")" ) 

メッセージは私の正規表現が無効であることを示しています。ご覧のとおり、正規表現 "(?!\))" の 2 番目の部分の括弧が正しく一致していません。私のエディターに関しては、最初の "(" は直後の ")" と一致しますが、これは閉じ括弧を意味するものではありません (その右にあるものはそうです)。正規表現からこのエラーだけを確認できました。実際に何が間違っているのか教えてください。これを行う他の方法はありますか?

4

2 に答える 2

6

2 つのステップで、肯定的な先読みを使用します。

str1 <- gsub("\\([a-z](?=\\()", "\\(", str, perl=TRUE)
str1
# [1] "(((c)d)(e)f)"
str2 <- gsub("\\)[a-z](?=\\))", "\\)", str1, perl=TRUE)
str2
# [1] "(((c))(e))"

編集:1つでそれを行うことさえできることがわかりました:

gsub("([\\(\\)])[a-z](?=\\1)", "\\1", str, perl=TRUE)
# [1] "(((c))(e))"
于 2012-06-17T19:41:56.950 に答える
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で書いています:-)

于 2012-06-17T19:44:39.180 に答える