我正在寻找一种解决方案,将一个字符串与一组通配符字符串相匹配。例如
>>> match("ab", ["a*", "b*", "*", "c", "*b"])
["a*", "*", "*b"]
输出的顺序并不重要。
我将按照10 ^ 4个通配符字符串的顺序进行匹配,我会做~10 ^ 9个匹配调用。这意味着我可能不得不重写我的代码:
>>> matcher = prepare(["a*", "b*", "*", "c", "*b"]
>>> for line in lines: yield matcher.match("ab")
["a*", "*", "*b"]
我已经开始在Python中编写一个处理通配符的trie实现,我只需要正确处理这些极端情况。尽管如此,我很想听到; 你怎么解决这个问题?是否有任何Python库可以让我更快地解决这个问题?
到目前为止的一些见解:
答案 0 :(得分:3)
在Aho-Corasick算法实现(或类似)的帮助下,您可以使用re2 library中的FilteredRE2
类。来自re2 docs:
必需的子字符串。假设您有一种有效的方法来检查哪些 字符串列表在大文本中显示为子字符串(for 例如,也许您实现了Aho-Corasick算法),但现在 您的用户希望能够进行正则表达式搜索 也很有效率。正则表达式通常具有大的文字字符串 在他们中;如果能够识别它们,它们可以被输入 字符串搜索器,然后字符串搜索器的结果可能是 用于过滤正则表达式搜索集 必要。 FilteredRE2类实现此分析。给出一个 正则表达式列表,它将正则表达式转到 计算涉及文字字符串的布尔表达式然后 返回字符串列表。例如,FilteredRE2转换 (hello | hi)world [a-z] + foo into boolean expression“(helloworld OR hiworld)AND foo“并返回这三个字符串。鉴于多个 正则表达式,FilteredRE2将每个转换为布尔值 表达式并返回所涉及的所有字符串。之后,成为 告诉我哪些字符串存在,FilteredRE2可以评估每个字符串 表达式,用于标识可能的正则表达式集 可能存在。这种过滤可以减少实际数量 正则表达式搜索显着。
这些分析的可行性在很大程度上取决于简单性 他们的意见第一个使用DFA表单,而第二个使用 解析正则表达式(Regexp *)。这种分析将是 如果RE2允许非常规,则更复杂(甚至可能不可能) 正则表达式中的特征。
答案 1 :(得分:2)
似乎Aho-Corasick algorithm会起作用。 esmre似乎正在寻找我正在寻找的东西。我从this question获得了这些信息。