在 R 中使用模糊 LR 模式提取字符串

Extract strings using fuzzy LR patterns in R

我挣扎了很久

我设法提取字符串中左右模式之间的所有内容,如下例所示。

library(tidyverse)

data=c("everything will be ok one day")

str_extract(string = data, pattern = "(?<=thing).*(?=ok one)")
#> [1] " will be "

reprex package (v2.0.1)

于 2022-01-26 创建

正如您在代码中注意到的那样,我提取了“thing”和“ok one”之间的所有内容。

我需要将不匹配的可能性纳入这些模式中。 我想允许最多两个 不匹配 并考虑插入缺失和插入。


示例 1

例如我要解释的一个不匹配 是在所有内容中插入字母“s”

dat.1=c("everythings will be ok one day")

在这种情况下,我希望能够提取短语

will be 

示例 2

dat.2=c("everythingswillbeokoneday")

在这种情况下,我希望能够提取短语

will be 

PS: 这只是一个简化的例子。我的实际数据不包含差距,而且很复杂。期待您的帮助和指导。

一种方法是使用字符串的模糊匹配,例如,依赖包 stringdist 和计算,对于每个分隔符字符串(thingok,在您的示例中), 相应的匹配分数(即下面函数 maxsim 所做的)。

library(tidyverse)
library(stringdist)

dat.1=c("everythings will be ok one day")

maxsim <- function(df, delim)
{
  df %>% 
    str_split(" ") %>% unlist %>% 
    map(~ stringsim(delim,.x)) %>% 
    which.max
} 

dat.1 %>% 
  str_split(" ") %>% unlist %>% 
  .[ (maxsim(dat.1,"thing") + 1) : (maxsim(dat.1,"ok") - 1) ] %>% 
  str_c(collapse = " ")

#> [1] "will be"