12

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

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

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

正则表达式用于在没有被单引号或双引号包围时使用空格分割字符串

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

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

我想要的是

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

但我得到的是:

[1] ""  " " " " " "

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

提前致谢!

4

3 回答 3

17

scan会为你做这个

scan(text=str, what='character', quiet=TRUE)
[1] "rainfall"        "snowfall"        "Channel storage" "Rivulet storage"
于 2012-11-29T14:54:35.430 回答
5

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

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

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

str <- 'rainfall snowfall "Channel storage" "Rivulet storage"'
regex <- "[^\\s\"]+|\"([^\"]+)\""

regmatches(str,gregexpr(regex,str,perl=TRUE))

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

于 2012-11-29T15:09:41.917 回答
2

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

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

[1] "rainfall"          "snowfall"          "'Channel storage'" "'Rivulet storage'"
于 2012-11-29T21:17:27.107 回答