使用正则表达式

时间:2015-07-09 06:47:53

标签: regex r nlp tokenize strsplit

我有一个字符串向量,其中一些包括标点/符号。例如:

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"

编辑:添加数字作为要分离的类

2 个答案:

答案 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]+'))