我有一个字符串向量,其中一些包括标点/符号。例如:
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"
编辑:添加数字作为要分离的类
答案 0 :(得分:3)
您可以尝试
res <- unlist(strsplit(words, '(?<=\\w)(?=\\W)|(?<=\\W)(?=\\w)',
perl=TRUE))
res
#[1] "hi" "my" "." "name" "!" "is" "\"" "joe" "\""
或使用str_extract_all
library(stringr)
unlist(str_extract_all(words, '\\w+|\\W+'))
#[1] "hi" "my" "." "name" "!" "is" "\"" "joe" "\""
编辑:添加了@Avinash Raj的建议
words <- c("hi", "my.", "name!", "is", '"joe"')
答案 1 :(得分:2)
只是分开存在于中间的单词边界。
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]+'))