如何有效地匹配字符串与一组通配符字符串?

时间:2012-10-15 22:19:33

标签: python

我正在寻找一种解决方案,将一个字符串与一组通配符字符串相匹配。例如

>>> 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库可以让我更快地解决这个问题?

到目前为止的一些见解:

  • 命名(Python,re)正则表达式对我不起作用,因为它们只返回一个匹配。
  • pyparsing看起来像是一个很棒的库,但是文档很少,而且正如我所见,它不支持匹配多个模式。

2 个答案:

答案 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获得了这些信息。