我有一个字符串向量,其中一些包括标点符号。例如:
words <- ("hi", "my.", "name!", "is98", ""joe"")
我的目标是创建一个包含所有这些单词的向量,但标点符号,数字和符号在向量中被制成自己的字符串。所以在这种情况下
("hi", "my", ".", "name", "!", "is", "98", """, "joe", """)
我最初的计划是使用grep
标识存在标点符号的索引,然后遍历它们,strsplit
并根据所述标点符号对它们进行划分,如下所示:
puncIndex <- grep('[\\"!?.^]', words)
for(i in puncIndex){
strsplit(words[i], '[\\"!?.^]')
}
但是我有几个问题。一个原因是,我意识到的结果strsplit
将是一个列表本身,并且我想不出如何干净地将每个分量移回原始向量。另一个是即使我只尝试strsplit
一个单词,它也只会返回第一部分。例如:
strsplit(words[2], ".")
[[1]]
[1] "my"
编辑:添加数字作为一个类也要分开
只需在中间存在的单词边界处拆分即可。
words <- c("hi", "my.", "name!", "is", '"joe"')
unlist(strsplit(words, '(?<=.)\\b(?=.)', perl=TRUE))
#[1] "hi" "my" "." "name" "!" "is" "\"" "joe"
#[9] "\""
这里的技巧\\b
称为单词边界,它在单词char和非单词char之间进行匹配(反之亦然)。因此,如果起始字符和结束字符是单词字符,则仅此一项即可匹配起始字符和结束字符。但是使用断言,可以确保在单词边界前后必须至少存在一个字符。
更新:
library(stringr)
unlist(str_extract_all(words, '[A-Za-z]+|[^A-Za-z]+'))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句