|
|
1
4
Perl有两个类似于Text::Trie的模块,您可以通过raid获取想法。(见鬼,我想我甚至在很久以前写过一篇) |
|
|
2
4
您应该选择适合您试图解决的问题的数据结构。如果必须匹配任意正则表达式,我不知道有什么好的解决方案。如果要使用的正则表达式类限制性更强,则可以使用数据结构,例如 trie suffix tree |
|
|
3
4
|
|
|
4
4
这是绝对可能的,只要您使用的是“真正的”正则表达式。教科书中的正则表达式可以被 deterministic finite state machine ,这主要意味着您不能在其中包含反向引用。 正则语言的一个特性是“两种正则语言的并集是正则的”,这意味着您可以使用单个状态机同时识别任意数量的正则表达式。相对于表达式的数量,状态机以O(1)时间运行(相对于输入字符串的长度,状态机以O(n)时间运行,但哈希表也以O(n)时间运行)。
|
|
|
5
3
如果你有一本字典,比如
在这种情况下
|
|
|
6
3
那么以下内容呢:
它基本上是Python中dict类型的一个子类。有了它,您可以提供一个正则表达式作为键,并且使用yield以一种可移植的方式返回与此正则表达式匹配的所有键的值。 使用此选项,您可以执行以下操作:
|
|
|
7
3
这里是一种有效的方法,它将键组合到一个编译的regexp中,因此不需要在键模式上进行任何循环。它滥用法律
如果不重新编译regexp,这个映射是不可扩展的(不能定义新的键),但是在某些情况下它很方便。
|
|
|
8
2
有一个Perl模块就是这样做的 Tie::Hash::Regex
|
|
|
9
2
@rptb1您不必避免捕获组,因为您可以使用re.groups来计算它们。这样地:
遗憾的是,很少有RE引擎真正将regexp编译成机器代码,尽管这并不特别困难。我怀疑有一个数量级的性能改进等待着有人制作一个真正好的RE-JIT库。 |
|
|
10
1
"n-grams" . 创建一个从单词的n个字符块到整个单词的倒排索引。当给定一个模式时,将其分成n个字符的块,并使用索引计算匹配单词的评分列表。 即使您不能接受近似值,在大多数情况下,这仍然会提供精确的过滤机制,这样您就不必对每个键应用正则表达式。 |
|
|
11
1
这个问题的一个特例出现在70年代面向演绎数据库的人工智能语言中。这些数据库中的键可以是带有变量的模式——就像没有*或|运算符的正则表达式一样。他们倾向于对索引使用trie结构的奇特扩展。参见诺维格的《克里普》*.lisp Paradigms of AI Programming |
|
|
12
1
如果您有一小组可能的输入,您可以缓存第二个dict中出现的匹配项,并为缓存的值获取O(1)。 如果一组可能的输入太大而无法缓存,但也不是无限的,那么您可以将最后N个匹配项保留在缓存中(查看谷歌的“LRU地图”——最近使用最少的)。
|
|
|
13
1
为了避免多个键匹配输入的问题,我给每个regex键一个优先级,并使用最高优先级。 |
|
|
14
0
|
|
|
15
0
例如,如果有人这样做会发生什么:
这样的事情怎么可能是O(1)? |
|
|
16
0
信息技术 通过将搜索表达式连接到一个用“|”分隔的大正则表达式中,可以让正则表达式编译器为您完成大部分工作。在这种情况下,聪明的正则表达式编译器可能会在备选方案中搜索共性,并设计出一种比简单地依次检查每个选项更有效的搜索策略。但我不知道是否有编译器可以做到这一点。 |
|
|
17
0
这实际上取决于这些正则表达式的外观。如果你没有太多的正则表达式,它们几乎可以匹配
为正则表达式构建反向索引(rabin karp hash(“固定模式”)->包含“固定模式”的正则表达式列表)。然后在匹配时,使用Rabin-Karp散列计算滑动散列并查找反向索引,一次前进一个字符。现在有了O(1)查找反向索引非匹配项和合理的O(k)查找匹配项的时间,k是反向索引中正则表达式列表的平均长度。对于许多应用程序,k可能非常小(小于10)。反转索引的质量(假阳性意味着更大的k,假阴性意味着错过匹配)取决于索引器对正则表达式语法的理解程度。如果正则表达式是由人类专家生成的,那么它们也可以为包含的固定模式提供提示。 |
|
|
18
0
构造函数加载正则表达式字符串并调用必要的代码,以便使用
下面是我的一些代码片段:
现在是执行大量模式/动作对的fasterlex_引擎类:
此代码通过参数符号创建构造函数调用器
} 这段代码附加了一个any处理函数(静态或非静态),用于处理由输入字符串匹配引发的回调
|
|
|
19
0
这个问题与正则表达式无关——如果字典中的键与lambdas的函数相同,则会出现同样的问题。因此,您面临的问题是,是否有一种方法可以对函数进行分类,以确定其是否返回真值,这不是搜索问题,因为f(x)在之前通常是未知的。
--DM |