尝试理解与 regex 的模糊模式匹配。我想要的:我有一个字符串,我想在其他可能更大的字符串中找到相同或相似的字符串。 (数据库记录中的一个字段是否可能作为模糊子字符串出现在该数据库记录中的任何其他字段中?)
这是一个示例。评论表示角色位置。
import regex
to_search = "1990 /"
#123456
# ^^ ^
search_in = "V CAD-0000:0000[01] ISS 23/10/91"
#12345678901234567890123456789012
# ^^ ^
m = regex.search(f'({to_search}){{e<4}}', search_in, regex.BESTMATCH)
结果:
>>> m
<regex.Match object; span=(27, 30), match='10/', fuzzy_counts=(0, 0, 3)>
>>> m.fuzzy_changes
([], [], [28, 29, 31])
没有插入,没有替换,在位置 28、29 和 31 处有 3 个删除。“插入替换删除”的顺序很重要,它取自here。
问题:用正常的人类语言如何解释这一点?它说什么(我认为):
“如果删除其中的位置 28、29 和 31,则您的
中的子字符串10/
会匹配。”search_in
我可能弄错了。这是真的':
“如果您按顺序删除位置 5、3 和 2,则在
中,您将在to_search
中的子字符串10/
处获得完全匹配,耶!”search_in
幸运的是,我找到了一位大师!所以我做到了
>>> import orc
>>> m = regex.search(f'({to_search}){{e<4}}', search_in, regex.BESTMATCH)
>>> m
<regex.Match object; span=(27, 30), match='10/', fuzzy_counts=(0, 0, 3)>
>>> near_match = orc.NearMatch.from_regex(m, to_search)
>>> print(near_match)
10/
I
190/
I
1990/
I
1990 /
嗯...所以
fuzzy_counts
的顺序,实际上是,某物,某物,插入?
如果有人能解释这一点,我将不胜感激。
你很接近。但根据您在帖子中提到的文档,这就是这里发生的事情。
要在字符串
"1990 /"
中搜索
"V CAD-0000:0000[01] ISS 23/10/91"
import regex
to_search = "1990 /"
#123456
# ^^ ^
search_in = "V CAD-0000:0000[01] ISS 23/10/91"
#12345678901234567890123456789012
# ^^ ^
m = regex.search(f'({to_search}){{e<4}}', search_in, regex.BESTMATCH)
m
输出:
<regex.Match object; span=(27, 30), match='10/', fuzzy_counts=(0, 0, 3)>
m.fuzzy_changes
输出:
([], [], [28, 29, 31])
解释
这意味着什么:
要与我们正在搜索的字符串完全匹配,我们应该查看以下字符串
V CAD-0000:0000[01] ISS 23/1990 /91
但是,有
0 substitutions, 0 insertions, and 3 deletions
由该字符串制成,以获得实际的字符串。
所做的删除位于
[28, 29, 31]
位置,这使我们看到了实际的字符串
V CAD-0000:0000[01] ISS 23/10/91