r - 如何提取和删除字符串?所以我可以让相似的表达式匹配 1 次而不是多次

标签 r string stringr

问题描述:我目前正在从一系列书籍中提取名称。许多角色会以昵称、名字的一部分或头衔命名。我有一个名称列表,用作所有数据的模式。问题是我得到了全名和部分名称的多个匹配项。总共有 3000 个名称和名称的变体,我正在阅读大量文本。当前按从最长字符串到最短字符串的顺序提取名称。

问题:

如何确保在提取模式后,从字符串中删除它匹配的任何文本?

我得到了什么:

str_extract("Mr Bean and friends", pattern = fixed(c("Mr Bean", "Bean", "Mr")))  
[1] "Mr Bean" "Bean"    "Mr"     

我要的是: (我知道我不能仅使用 str_extract() 或一行代码来实现这一点)
str_extract("Mr Bean and friends", pattern = fixed (c("Mr Bean", "Bean", "Mr")))  
[1] "Mr Bean" NA NA    

最佳答案

一种选择是递归更新。因为我们想要一个输出 vectorlength 'n' 等于 lengthpattern vector ,创建一个输出向量来存储值,然后通过从字符串中删除“模式”并更新它来更新每个“模式”执行后的初始字符串

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   

或与 vapply 相同的方法并使用 <<- 更新初始字符串
unname(vapply(pat, function(p) {
   out <- str_extract(str1, p)
   str1 <<- str_remove(str1, p)
   out}, character(1)))
#[1] "Mr Bean" NA        NA       

数据
# 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

关于r - 如何提取和删除字符串?所以我可以让相似的表达式匹配 1 次而不是多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54504845/

相关文章:

c - 为什么我的旋转字符串函数中的模运算不正确?

regex - 使用 stri_replace_all_fixed 匹配精确单词

r - 从 R 中的字符串向量匹配单词

c - 用其他子字符串替换字符串的子字符串时出现段错误

objective-c - 特定字符串和 NSScanner

r - 有效地在因子向量上引入新的水平

debugging - 如何获取R脚本出错时的行号?

regex - R中非常大的文件的字符串匹配

R:如何优雅地将代码逻辑与UI/html-tags分开?

r - 无法用RSQLite/DBI包替换SQLite表