按空格拆分字符串,但引号内的空格除外

12

我一直在尝试使用R语言将带有双引号的空格分隔字符串进行拆分,但是一直没有成功。 这是一个字符串示例:

rainfall snowfall "Channel storage" "Rivulet storage"

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

使用正则表达式通过空格拆分不被单引号或双引号包围的字符串

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

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

what I would like is

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

但是我得到的是:
[1] ""  " " " " " "

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

提前致谢!

3个回答

17

scan 会为您完成这个操作。

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

5
正如mplourde所说,请使用scan。这是最干净的解决方案(除非你想保留"...)
如果你想使用正则表达式来实现这个(或者其他一些不容易通过scan解决的问题),那么你仍然是错误的。你的正则表达式返回了你想要的结果,所以如果你在strsplit中使用它,它会切掉你想要保留的所有内容。
在这种情况下,你应该看一下gregexp函数,它返回你匹配的起始位置并将匹配长度作为属性添加。这个结果可以传递给regmatches()函数,像这样:
str <- 'rainfall snowfall "Channel storage" "Rivulet storage"'
regex <- "[^\\s\"]+|\"([^\"]+)\""

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

但如果您只需要mplourde返回的字符向量作为解决方案,那么就选择它吧。而且很可能那正是您想要的。


3
你可以使用 regmatches 替代 mapplyregmatches(str, gregexpr(regex,str,perl=TRUE))[[1]] - Matthew Plourde
谢谢Joris(和mplourde)--你们说得对,scan是我需要的,但是看到如何在这种情况下应用regmatches()对我非常有用。 - downtowater

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'"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接