在我的SO活动中,我发现许多R用户使用strsplit()
进行文本操作,即使结果中没有发生实际的拆分。话虽这么说,这是我的问题:
采用以下字符向量x
:
> x <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2")
我可以使用正则表达式和gsub()
> gsub(".*\\s", "", x)
# [1] "2" "1" "2" "1" "2"
我也可以用strsplit()
来做。但是,由于strsplit()
的算法(在本文的底部注明),""
位于每场比赛的前面。
> unlist(strsplit(x, ".*\\s"))
# [1] "" "2" "" "1" "" "2" "" "1" "" "2"
通过在上面的结果上调用""
,可以轻松删除这些nzchar()
字符串。当然,我可以使用strsplit()
和nzchar()
编写一个函数来完成所有操作。
> f <- function(x, pattern)
{
y <- unlist(strsplit(x, pattern))
y[nzchar(y)]
}
> f(x, ".*\\s")
# [1] "2" "1" "2" "1" "2"
由于strsplit()
在其split
参数中接受正则表达式,我认为可能从unlist(strsplit(...))
得到与{fom gsub(...)
相同的结果。有没有人知道如何做到这一点,或者它是否可能?
?strsplit
的注意:
应用于每个输入字符串的算法...意味着如果在(非空)字符串的开头存在匹配,则输出的第一个元素是&#34;&#34;,但是如果字符串末尾有一个匹配项,输出与删除的匹配项相同。当前语言环境中的无效输入最多会被警告5次。
答案 0 :(得分:2)
正如你在strsplit
的定义中指出的那样,你得到空字符串的原因是:
如果在(非空)字符串的开头有匹配,则 输出的第一个元素是&#34;&#34;
如果您不想在最后致电nzchar
,仍然使用strsplit
,则可以插入虚拟角色:
res <- unlist(strsplit(paste0('#',x),'\\d{4} '))
res[res !="#"]
[1] "2" "1" "2" "1" "2"
但我认为最好使用sub
替换不需要的字符(不是gsub
):
sub('\\d{4} ','',x)