使用正则表达式拆分向量中的特定字符串

Split specific strings in a vector using regex

我有一个字符串向量,其中一些包含 punctuations/symbols。例如:

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 一个词,它也只是 returns 第一部分。例如:

strsplit(words[2], ".")
[[1]]
[1] "my"

编辑:添加数字作为 class 进行分隔

你可以试试

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

就在中间的单词边界上拆分。

words <- c("hi", "my.", "name!", "is", '"joe"')
unlist(strsplit(words, '(?<=.)\b(?=.)', perl=TRUE))
#[1] "hi"   "my"   "."    "name" "!"    "is"   "\""   "joe" 
#[9] "\"" 

这里的技巧是 \b 称为单词边界,它在单词字符和非单词字符之间匹配(反之亦然)。因此,如果开始和结束字符是单词字符,那么仅此一项就可以匹配开始和结束。但是使用断言,它确保在单词边界之前和之后必须至少存在一个字符。

更新:

library(stringr)
unlist(str_extract_all(words, '[A-Za-z]+|[^A-Za-z]+'))