擅长:python、mysql、java
<p>你应该读<a href="http://oreilly.com/catalog/9780596002893" rel="nofollow noreferrer">Mastering Regular Expressions</a>。问题是:</p>
<pre><code>(?:[\d]*[\,\.\ \-]+)*
</code></pre>
<p>这需要指数时间。尝试使用:</p>
^{pr2}$
<p>它应该匹配相同的东西,但需要线性时间。检查了你的例子,这确实加快了速度。在</p>
<p>您似乎还意外地将捕获组引入到您的模式中,例如将(AM)更改为(?)?:AM)来解决这个问题。这将从上面的示例中得到以下输出:</p>
<pre><code>[' Aug 6 20:43:20 2003', ' Mar 14 06:02:55 1973', ' March 14 06:02:55 AM 1973', ' Jun 16 20:18:03 1981']
['2003-08-06', '2003-08-07', '2003-07-23', '1973-01-18', '3/14/1973', '16/6/1981', '16/6/1981', '16/6/1981', '16/6/1981', '08/08/2003']
</code></pre>
<p>为了深入了解细节(我所参考的这本书非常擅长),*和+的工作方式(在NFAs中,比如python的re)就像一个循环。原始模式的内部循环将匹配一长串数字,但当后续模式无法匹配时,它将一次“放弃”一个数字。然后外循环将在剩余的模式上重新运行内部循环,当然它会立即再次获取数字。每次内循环的一个实例放弃一个数字时,将调用一个新的副本来再次获取它。最终,一旦引擎完成了分割数字串的所有可能的方法(可能性的指数级),它将把起始点向前移动一个字符…然后再试一次。在</p>
<p>另一方面,你的模式看起来有点疯狂;)</p>