微调Python正则表达式模糊匹配

-1 投票
1 回答
78 浏览
提问于 2025-04-14 17:02

我正在使用Python的一个正则表达式库(不是标准的re库)来进行模糊匹配,但在调整过滤器方面遇到了一些困难,这些过滤器限制了错误类型和允许的字符。我有一个术语列表,想要在多个文本文件中找到匹配项,同时允许在单词中插入任意数量的下划线。例如,我希望“foobar”能够匹配“_foobar_”、“_foo_bar_”、“f_o_o_b_a_r”等等。

这个例子返回了我想要的结果,但允许的错误类型太多了:

import regex

if m:= regex.search("(?b)\\b(?:test){e<=3}\\b", "_test_"):
    print(m)
else: print(None)

结果: <regex.Match object; span=(0, 6), match='_test_', fuzzy_counts=(0, 2, 0)>

上面例子中的“fuzzy_counts”让我觉得我可以把错误类型限制为仅插入错误,最终我希望只允许插入下划线,但在做这些更改时没有得到任何匹配:

if m:= regex.search("(?b)\\b(?:test){i:_}\\b", "_test_"):
    print(m)
else: print(None)

结果: None

if m:= regex.search("(?b)\\b(?:test){i}\\b", "_test_"):
    print(m)
else: print(None)

结果: None

让我觉得这些例子更奇怪的是,如果我在搜索的字符串两边加上空格,限制错误为仅插入下划线的过滤器就能返回预期的结果(但我不能指望文本中会有额外的字符)。

if m:= regex.search("(?b)\\b(?:test){i:_}\\b", " _test_ "):
    print(m)
else: print(None)

结果: <regex.Match object; span=(1, 7), match='_test_', fuzzy_counts=(0, 2, 0)>

有没有什么建议可以帮助我修正这个允许错误的过滤器,以便我可以在单词边界内匹配术语,同时允许插入任意数量的下划线?

1 个回答

-1

你的代码基本上是对的,但可以试试这些修改。

import regex

pattern = r"(?b)\b_*(?:test_*){e<=3}\b"
text = "_test_"

if m := regex.search(pattern, text):
    print(m)
else:
    print(None)

我修改了样式,让“test”这个词前后可以有随机数量的下划线。这是通过在“test”前后加上 _* 来实现的。你可以参考这篇文章,里面有个不错的例子,讲的是 用Python和正则表达式

撰写回答