我在R中有一个文本处理问题。我想在一个字符串中得到一个字符,其中一个不同的字符串与一些编辑距离进行精确匹配和/或模糊匹配。例如:
A = "blahmatchblah"
B = "match"
C = "latch"
我想回复一些东西,告诉我字符串A中的第5个字符是搜索B和C的匹配。我知道的所有模式匹配工具都会告诉我是否有(模糊) A中匹配B和C,但匹配开始时没有匹配。
答案 0 :(得分:0)
我没有回复评论,但至少在你的问题的第一部分:gregexpr(B,A)[[1]] [1]将产生5,因为“匹配”是一个有效的子序列A.
答案 1 :(得分:0)
基函数aregexec()
用于近似字符串位置匹配。不幸的是,它没有在pattern
上进行矢量化,因此我们必须使用循环来获取B
和C
的位置。
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 ,有更多信息。