使用正则表达式拆分向量中的特定字符串
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]+'))
我有一个字符串向量,其中一些包含 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]+'))