r - 从 agrep 中提取子字符串匹配

标签 r levenshtein-distance agrep

我的目标是确定给定的文本中是否有target字符串,但我想允许拼写错误/小派生并提取“导致”的子字符串“匹配(用于进一步的文本分析)。

示例:

target <- "target string"
text <- "the target strlng: Butter. this text i dont want to extract."

所需输出:

我希望将 target strlng 作为输出,因为它非常接近目标(编辑距离为 1)。接下来我想使用 target strlng 来提取单词 Butter (这部分我已经介绍过,我只是添加它以获得详细的规范)。

我尝试过的:

使用 adist 不起作用,因为它比较两个字符串,而不是子字符串。

接下来我看了一下agrep,它看起来非常接近。我可以得到我的目标已找到的输出,但不能得到“导致”匹配的子字符串

我尝试使用value = TRUE,但它似乎适用于数组级别。我认为我不可能切换到数组类型,因为我不能用空格分割(我的目标字符串可能有空格,...)。

agrep(
  pattern = target, 
  x = text,
  value = TRUE
)

最佳答案

使用aregexec,它类似于使用regexpr/regmatches(或gregexpr)进行精确匹配提取。

m <- aregexec('string', 'text strlng wrong')
regmatches('text strlng wrong', m)
#[[1]]
#[1] "strlng"

可以将其包装在使用 aregexecregmatches 参数的函数中。请注意,在后一种情况下,函数参数 invert 位于点参数 ... 之后,因此它必须是命名参数。 p>

aregextract <- function(pattern, text, ..., invert = FALSE){
  m <- aregexec(pattern, text, ...)
  regmatches(text, m, invert = invert)
}

aregextract(target, text)
#[[1]]
#[1] "target strlng"

aregextract(target, text, invert = TRUE)
#[[1]]
#[1] "the "                                       
#[2] ": Butter. this text i dont want to extract."

关于r - 从 agrep 中提取子字符串匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58914919/

相关文章:

r - 如何在 R 中的 2 个列表的元素之间应用函数?

rJava 安装失败(MacOS、Red Hat)

r - 如何过滤出Tibble列表列的NULL元素

python - 在 python 中实现 Levenshtein 距离

c++ - 有效地检查一个字符串是否是(大约包含在)另一个字符串的近似子字符串,直到给定的错误阈值?

r - 根据多个正则表达式匹配过滤 data.table 的内容

mysql - 您可以使用 levenshtein 或类似函数将表与 mysql 进行比较吗?

string-matching - 产品名称的模糊匹配

r - 单个列表中的近似字符串匹配 - r

R agrep() 函数行为