擅长:python、mysql、java
<p>您的规则似乎是这里的罪魁祸首:因为两个<code>.*</code>,由lookahead分隔,所以必须检查非常多的置换才能成功匹配(或排除匹配)。使用不带锚点的<code>re.search()</code>进一步加剧了这一点。另外,包括<code>posto</code>部分的替换是多余的-正则表达式匹配字符串中是否有<code>posto</code>的内容,因此您最好完全删除它。在</p>
<p>例如,您的第一条规则可以重写为</p>
<pre><code>^(?!.*ipiranga)(?=.*petrobras)
</code></pre>
<p>结果没有任何变化。如果要查找精确的单词,可以使用单词边界进一步优化它:</p>
^{pr2}$
<hr/>
<p>一些测量(使用<a href="http://www.regexbuddy.com" rel="nofollow">RegexBuddy</a>):</p>
<p>应用于字符串<code>Acabei de ir no posto petrobras. Moro pertinho do posto brasil</code>的第一个正则表达式需要正则表达式引擎大约4700步才能找到匹配项。如果我去掉<code>petrobras</code>中的<code>s</code>,则需要超过100000个步骤来确定不匹配。在</p>
<p>我的匹配分为230步(260步失败),因此只要正确构造正则表达式,就可以获得20-400倍的速度。在</p>