【问题标题】:R : regular expression for 'not followed by' not workingR:“不跟随”的正则表达式不起作用
【发布时间】:2012-06-17 18:16:46
【问题描述】:

我需要保留括号中的单词并删除以下字符串中的其他单词。

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

消息显示我的正则表达式无效。如我所见,正则表达式“(?!\))”第二部分中的括号不正确匹配。至于我的编辑器,第一个“(”与紧随其后的“)”匹配,这并不意味着是一个闭括号(它右边的那个是)。我可以从我的正则表达式中找出这个错误。你能告诉我到底出了什么问题吗?有没有其他方法可以做到这一点?

【问题讨论】:

  • 我认为即使您有一个有效的正则表达式,您尝试做的事情也不会像您预期的那样工作。请注意,“d”和“f”后面是“)”。您可能需要使用多个 gsub。

标签: regex r


【解决方案1】:

分两步,并使用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))"

【讨论】:

  • 有人能解释一下上面的意思吗?我无法进行以下工作: str
【解决方案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 上 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    相关资源
    最近更新 更多