【问题标题】:Splitting a string by space except when contained within quotes用空格分割字符串,除非包含在引号中
【发布时间】:2012-11-17 15:45:36
【问题描述】:

一段时间以来,我一直在尝试用 R 中的双引号拆分空格分隔的字符串,但没有成功。字符串示例如下:

降雨降雪“渠道蓄水”“小溪蓄水”

这对我们很重要,因为这些是必须与后续数据匹配的列标题。这个网站上还有其他关于如何解决这个问题的建议,但它们似乎不适用于 R。一个例子:

Regex for splitting a string using space when not surrounded by single or double quotes

这是我一直在尝试的一些代码:

str <- 'rainfall snowfall "Channel storage" "Rivulet storage"'
regex <- "[^\\s\"']+|\"([^\"]*)\""
split <- strsplit(str, regex, perl=T)

我想要的是

[1] "rainfall" "snowfall" "Channel storage" "Rivulet storage"

但我得到的是:

[1] ""  " " " " " "

向量的长度是正确的(这是令人鼓舞的),但字符串当然是空的或包含一个空格。有什么建议吗?

提前致谢!

【问题讨论】:

    标签: regex r strsplit


    【解决方案1】:

    scan 会为你做这件事

    scan(text=str, what='character', quiet=TRUE)
    [1] "rainfall"        "snowfall"        "Channel storage" "Rivulet storage"
    

    【讨论】:

    • 谢谢 mplourde。这正是我所需要的。
    【解决方案2】:

    正如 mplourde 所说,使用scan。这是迄今为止最干净的解决方案(除非你想保留\",也就是说......)

    如果您想使用正则表达式来执行此操作(或 scan 无法轻松解决的问题),您仍然以错误的方式看待它。您的正则表达式会返回您想要的内容,因此如果您在 strsplit 中使用它,它将删除您想要保留的所有内容。

    在这些情况下,您应该查看函数gregexp,它返回匹配的起始位置并将匹配的长度添加为属性。这个结果可以传递给函数regmatches(),像这样:

    str <- 'rainfall snowfall "Channel storage" "Rivulet storage"'
    regex <- "[^\\s\"]+|\"([^\"]+)\""
    
    regmatches(str,gregexpr(regex,str,perl=TRUE))
    

    但是,如果您只需要字符向量作为 mplourde 的解决方案返回,那就去做吧。无论如何,这很可能就是您所追求的。

    【讨论】:

    • 你可以用regmatches代替mapply:regmatches(str, gregexpr(regex,str,perl=TRUE))[[1]]
    • 感谢 Joris(和 mplourde)——你说得对,我需要的是扫描,但对我了解如何在这种情况下应用 regmatches() 非常有用
    【解决方案3】:

    您可以使用 gsubfn 包中的 strapply。在 strapply 中,您可以定义匹配字符串而不是拆分字符串。

    str <- "rainfall snowfall 'Channel storage' 'Rivulet storage'"
    strapply(str,"\\w+|'\\w+ \\w+'",c)[[1]]
    
    [1] "rainfall"          "snowfall"          "'Channel storage'" "'Rivulet storage'"
    

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 2013-01-17
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 2020-04-26
      相关资源
      最近更新 更多