【问题标题】:split string with regex用正则表达式分割字符串
【发布时间】:2013-03-22 15:19:15
【问题描述】:

我正在寻找拆分通用形式的字符串,其中方括号表示字符串的“部分”。例如:

x <- "[a] + [bc] + 1"

并返回一个看起来像这样的字符向量:

"[a]"  " + "  "[bc]" " + 1"

编辑:最终使用了这个:

x <- "[a] + [bc] + 1"
x <- gsub("\\[",",[",x)
x <- gsub("\\]","],",x)
strsplit(x,",")

【问题讨论】:

  • 请将您最终使用的内容作为答案发布,而不是对帖子进行编辑。

标签: regex r strsplit


【解决方案1】:

我看过 TylerRinker 的代码并怀疑它可能比这更清楚,但这可能是学习一组不同功能的方式。 (在我注意到它在空格上拆分之前,我更喜欢他。)我尝试将其调整为与 strsplit 一起使用,但该函数总是删除分隔符。 也许这可以适应制作一个newstrsplit,在分隔符处拆分但将它们留在里面?可能不需要在第一个或最后一个位置拆分并区分开始和结束分隔符。

scan(text=   # use scan to separate after insertion of commas
            gsub("\\]", "],",   # put commas in after "]"'s
            gsub(".\\[", ",[",  x)) ,  # add commas before "[" unless at first position
        what="", sep=",")    # tell scan this character argument and separators are ","
#Read 4 items
#[1] "[a]"  " +"   "[bc]" " + 1"

【讨论】:

  • 我喜欢这种方法,因为它不依赖于空格进行分割。维护输出中的空白对于此任务并不重要,因此我对其进行了修改以使用strplit:
  • 感谢您的积极评价,但我认为@juba 是一个更好的答案。我将使用它来构造一个简单的解析函数,该函数接受一对参数来表示将被保留的开始和结束分隔符。
【解决方案2】:

这是一种懒惰的方法:

FUN <- function(x) {
    all <- unlist(strsplit(x, "\\s+"))
    last <- paste(c(" ", tail(all, 2)), collapse="")
    c(head(all, -2), last)
}

x <- "[a] + [bc] + 1"    
FUN(x)

## > FUN(x)
## [1] "[a]"  "+"    "[bc]" " +1"

【讨论】:

  • 你说'懒惰'是因为你使用空格而不是使用括号来分隔?
  • 是的(没有真正的正则表达式)
【解决方案3】:

您可以手动计算分割点并使用substring:

split.pos <- gregexpr('\\[.*?]',x)[[1]]
split.length <- attr(split.pos, "match.length")
split.start <- sort(c(split.pos, split.pos+split.length))
split.end <- c(split.start[-1]-1, nchar(x))
substring(x,split.start,split.end)
#  [1] "[a]"  " + "  "[bc]" " + 1"

【讨论】:

  • 好了。在进行“新闻拆分”方面取得了巨大进展。并不是说我完全理解它,但我认为gregexpr 会很有用。我很惊讶您不需要在模式中使用“\]”。
  • 我认为 ] 不需要转义,因为 [ 是字符类的结尾,因此它不会被解释为字符类的结尾。嗯,不确定我很清楚:-)
  • 我也有同样的想法,但它表明“特殊性”比我预期的更依赖于上下文。
【解决方案4】:

这是一个在括号上拆分并将它们保留在结果中的版本,使用积极的前瞻和后瞻:

splitme <- function(x) {
  x <- unlist(strsplit(x, "(?=\\[)", perl=TRUE))
  x <- unlist(strsplit(x, "(?<=\\])", perl=TRUE))
  for (i in which(x=="[")) {
    x[i+1] <- paste(x[i], x[i+1], sep="")
  }
  x[-which(x=="[")]
}
splitme(x)
#[1] "[a]"  " + "  "[bc]" " + 1"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多