<p>正如@Kuhess的回答中所描述的,您当前面临的问题是,您的规则包含了paranthesis并将它们用作正则表达式,但却没有逃过paranthesis(或其他在正则表达式中具有特殊含义的字符,如<code>*</code>)。在</p>
<p>但是,这仍然不能解释您观察到的行为,即在尝试匹配规则之前添加一个<code>print()</code>调用似乎可以解决问题。在</p>
<p>我能够从您的回购中复制出<code>unmatched paranthesis</code>错误和<a href="https://github.com/x2adrew/lexical_python/tree/unmatched" rel="nofollow">^{<cd4>} branch</a>。然后,在不改变任何东西的情况下,用完全相同的参数进行第二次运行就成功了!在</p>
<p>所以我仔细研究了你的代码,我很确定我知道为什么你的代码是不确定的:你使用一个<strong>字典</strong>(<a href="https://github.com/x2adrew/lexical_python/blob/unmatched/lex.py#L26" rel="nofollow">^{<cd5>}</a>)来存储规则,<a href="https://github.com/x2adrew/lexical_python/blob/unmatched/lex.py#L77" rel="nofollow">iterate over its keys</a>,和{<cd6>}一旦规则匹配,循环就存储起来。在</p>
<p>字典在Python中没有保证的顺序。<a href="https://www.youtube.com/watch?v=C4Kc8xzcA68" rel="nofollow">Their order isn't arbitrary</a>,但它几乎不可能预测,它可能会在后续运行之间或甚至在修改字典后发生变化。因此,在某些运行中,有问题的规则永远不会得到测试,因为一个有效的正则表达式匹配,而您<code>break</code>会退出<code>for</code>循环。在</p>
<p>所以,你不能,也永远不应该依赖字典的某个特定顺序。你有什么选择?在</p>
<p><strong>1)</strong>使用有序dict<em>(Python 2.7+)</em></p>
<p>您可以使您的<code>rulesDictionary</code>成为<a href="https://docs.python.org/2/library/collections.html#collections.OrderedDict" rel="nofollow">^{<cd10>}</a>的实例。<code>OrderedDict</code>将按项目插入的顺序保留这些项目:</p>
<pre><code>from collections import OrderedDict
# ...
self.rulesDictionary = OrderedDict()
</code></pre>
<p><strong>2)</strong>按键动态排序字典项,并按顺序迭代:</p>
^{pr2}$
<p>这将为您提供一个稳定的<em>字母顺序,而不是项目插入的顺序。我相信这些规则的顺序与你的情况有关,所以你应该选择1)。在</p>