regex Python模糊字符串搜索使用正则表达式

rqqzpn5f  于 11个月前  发布在  Python
关注(0)|答案(1)|浏览(91)

尝试理解用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
问题:如何用正常的人类语言来解释这个?它说了什么(我想):
如果删除search_in中的第28、29和31个位置,则会与子字符串10/匹配。
我可能搞错了。这是真的:
“如果您在to_search中按顺序删除位置5、3和2,则在search_in中的子字符串10/处有完全匹配,耶!”
幸运的是,我找到了a guru!,所以我做到了。

>>> 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的顺序,实际上是,某物,某物,* 插入 *?
如果有人能解释一下我会很感激的。

l7wslrjt

l7wslrjt1#

你很接近了。但是根据你在帖子中提到的文档,这就是这里发生的事情。

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/10/91”中搜索确切的序列“1990 /”。

调查结果:

*匹配发现:搜索在较长文本中发现类似序列“10/”。
*位置:发现该“10/”序列在较长文本中的位置27至30处开始。

解析:

为了得到一个精确的匹配,我们应该有一个更长的字符串,如下所示
第一个月
但是,为了得到实际的字符串,对该字符串进行了一些更改。

变更:

*删除
*位置:假定原始序列V CAD-0000:0000[01] ISS 23/1990 /91中的第28、29和31位被删除。
*Resultant String:经过这些删除后,假定的原始序列变成了实际的序列V CAD-0000:0000[01] ISS 23/10/91

相关问题