【问题标题】:How do I find the position of a (fuzzy) match within a string?如何在字符串中找到(模糊)匹配的位置?
【发布时间】:2017-07-22 00:01:09
【问题描述】:

我在 R 中有一个文本处理问题。我想在一个字符串中获取字符,其中不同的字符串进行精确匹配和/或模糊匹配,并具有一定的编辑距离。例如:

A = "blahmatchblah"
B = "match"
C = "latch"

我想返回一些信息,告诉我字符串 A 中的第 5 个字符是搜索 B 和 C 的匹配项。我知道的所有模式匹配工具都会告诉我是否存在(模糊)匹配 A 中的 B 和 C,但不匹配匹配开始的位置。

【问题讨论】:

    标签: r string text


    【解决方案1】:

    基函数aregexec()用于近似字符串位置匹配。不幸的是,它没有在pattern 上进行矢量化,因此我们必须使用循环来获取BC 的位置。

    sapply(c(B, C), aregexec, A)
    # $match
    # [1] 5
    # attr(,"match.length")
    # [1] 5
    #
    # $latch
    # [1] 5
    # attr(,"match.length")
    # [1] 5
    

    请参阅help(aregexec) 了解更多信息。

    【讨论】:

      【解决方案2】:

      我没有代表发表评论,但至少对于您问题的第一部分:gregexpr(B,A)[[1]][1] 将产生 5,因为“匹配”是一个有效的子序列答:

      【讨论】:

        【解决方案3】:

        几个月前,我在 R 中为fuzzywuzzy Python 包创建了一个接口,它具有 get_matching_blocks() 方法(它与您实际要求的非常接近)。

        假设你想找到两个字符串之间的匹配块,

        A = "blahmatchblah"
        B = "match"
        
        library(fuzzywuzzyR)
        
        init <- SequenceMatcher$new(string1 = A, string2 = B)
        
        init$get_matching_blocks()
        

        返回,

        [[1]]
        Match(a=4, b=0, size=5)
        
        [[2]]
        Match(a=13, b=5, size=0)
        

        第一个子列表给出了两个字符串的匹配块。 a = 4 给出字符串 A 的起始索引,b=0 给出字符串 B 的起始索引>(索引从 0 开始)。 size = 5 给出两个字符串匹配的字符数(在这种情况下,匹配块是“匹配”并且有 5 个字符)。

        documentation,尤其是 SequenceMatcher,有更多信息。

        【讨论】:

          猜你喜欢
          • 2011-05-21
          • 2016-08-17
          • 2012-02-14
          • 2014-11-02
          • 2010-09-23
          • 2017-08-03
          • 2018-04-30
          • 2018-05-31
          • 2021-04-19
          相关资源
          最近更新 更多