如何在字符串中找到(模糊)匹配的位置?

时间:2017-07-22 00:01:10

标签: r string text

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

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

我想回复一些东西,告诉我字符串A中的第5个字符是搜索B和C的匹配。我知道的所有模式匹配工具都会告诉我是否有(模糊) A中匹配B和C,但匹配开始时没有匹配。

3 个答案:

答案 0 :(得分:0)

我没有回复评论,但至少在你的问题的第一部分:gregexpr(B,A)[[1]] [1]将产生5,因为“匹配”是一个有效的子序列A.

答案 1 :(得分:0)

基函数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 :(得分:0)

几个月前,我在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 给出两个字符串匹配的字符数(在这种情况下,匹配块是&#34;匹配&#34;并且有5个字符)。

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

相关问题