【问题标题】:Split specific strings in a vector using regex使用正则表达式拆分向量中的特定字符串
【发布时间】:2015-07-09 06:47:52
【问题描述】:

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

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"

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

【问题讨论】:

    标签: regex r nlp tokenize strsplit


    【解决方案1】:

    你可以试试

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

    【讨论】:

    • 谢谢,第一个解决方案完美运行。还有一个问题(很抱歉忘记先问):我如何将它也更改为单独的数字?
    • @NeonBlueHair 请更新您的帖子,并添加一个包含数字的新示例
    【解决方案2】:

    只在中间存在的单词边界上分割。

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

    【讨论】:

    • 谢谢,这也有效!使用 \b 和使用 \w 像其他建议的答案一样有性能差异吗?
    • 对不起,我应该更好地表达我的问题。考虑到我尝试了两者并且它们都给出了相同的输出,我的意思是更多的输出差异。但是再次阅读您的解释,我想我明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多