问题描述:我目前正在从书籍系列中提取名称.许多角色将使用昵称,部分名称或标题.我有一个名单列表,我将其用作所有数据的模式.问题是我得到了全名和名字部分的多个匹配.我通过大量文本运行了总共3000个名称和名称变体.目前,名称从最长的字符串到最短的顺序被提取.
题:
如何确保在提取模式后,从字符串中删除它匹配的任何文本?
我得到了什么:
str_extract("Mr Bean and friends", pattern = fixed(c("Mr Bean", "Bean", "Mr")))
[1] "Mr Bean" "Bean" "Mr"
Run Code Online (Sandbox Code Playgroud)
我想要的是:(我知道我只能使用str_extract()或一行代码来实现这一点)
str_extract("Mr Bean and friends", pattern = fixed (c("Mr Bean", "Bean", "Mr")))
[1] "Mr Bean" NA NA
Run Code Online (Sandbox Code Playgroud)
一种选择是递归更新。vector由于我们希望 'n'的输出length等于lengthof pattern vector,因此创建一个输出向量来存储值,然后在执行每个 'pattern' 后通过从字符串中删除 'pattern' 并更新它来更新初始字符串
library(stringr)
for(i in seq_along(pat)) {
out[i] <- str_extract(str1, pattern = fixed(pat[i]))
str1 <- str_remove(str1, pat[i])
}
out
#[1] "Mr Bean" NA NA
Run Code Online (Sandbox Code Playgroud)
或者使用相同的方法并vapply更新初始字符串<<-
unname(vapply(pat, function(p) {
out <- str_extract(str1, p)
str1 <<- str_remove(str1, p)
out}, character(1)))
#[1] "Mr Bean" NA NA
Run Code Online (Sandbox Code Playgroud)
# initialize an output vector
out <- character(length(pat))
# pattern vector
pat <- c("Mr Bean", "Bean", "Mr")
# initial string
str1 <- "Mr Bean and friends"
str2 <- str1
Run Code Online (Sandbox Code Playgroud)