【发布时间】:2013-06-27 13:08:21
【问题描述】:
我正在寻求实现一些算法来帮助我匹配不完美的序列。
假设我有一个存储的 ABBABABBA 序列,我想在大量字符流中找到“看起来像”的东西。
如果我允许我的算法有 2 个通配符(差异),我如何使用正则表达式匹配如下内容: where ( 和 ) 标记差异:
A(A)BABAB(A)A
or
(B)BBA(A)ABBA
我的困境是,我希望在一大串字符中找到这些潜在的目标匹配(有缺陷)。 所以像这样:
ABBDBABDBCBDBABDB(A(A)BABAB(A)A)DBDBABDBCBDBAB
ADBDBABDBDBDBCBDBABCBDBABCBDBABCBDBABABBBDBABABBCD
DBABCBDABDBABCBCBDBABABDABDBABCBDBABABDDABCBDBABAB
我必须能够搜索这些“足够接近”的匹配项。
其中括号表示:(The Good enough Match with the (Differences))
编辑:为了在这个例子中更正式,如果 N-2 个字符与原始字符相同(2 个差异),则可以接受长度为 N 的匹配
我以前使用过正则表达式,但只是为了找到完美的序列——而不是为了“看起来像”的东西。
希望这足够清楚,可以得到一些建议。 感谢您的阅读和任何帮助!
【问题讨论】:
-
我认为要问的第一个问题是“什么是匹配?”它必须有一定的长度,包含特定的字符,包含特定的序列吗?
-
@Doc 在此示例中获取这些匹配项的情况下 - 匹配项与原始匹配项非常相似 - 但允许 2 个不正确的字符(通配符)。
-
能否请您更正式和准确一些?更正式定义的一个示例是:如果至少有 N-2 个字符匹配,则匹配大小为 N 的目标序列。另一个正式的定义是:大小从 N-2 到 N+2 的目标序列匹配,如果它可以减少到不超过 2 次编辑操作(添加/删除/替换)的模式序列。
-
@Doc 这只是一个非常简单的例子,实际上我使用了 4 个唯一字符,为此 (ABCD)。我目前录制了一个签名,ABCDBD。然后我搜索看起来可能的字符样本(允许差异(通配符)),因此如果允许 1 个通配符,AB(B)DBD 是匹配的,ABCDB(B) 也是如此。带有 2 个通配符,A(A)(B)DBD 等。
-
抱歉,我已经更新了原始帖子以显示我面临的问题的严重程度,感谢大家的帮助!