擅长:python、mysql、java
<p>下面的正则表达式可以做到这一点,尽管它有点神秘:</p>
<pre><code>-?(?:\d+())?(?:\.\d*())?(?:e-?\d+())?(?:\2|\1\3)
</code></pre>
<p><strong>说明:</strong></p>
<p>一个数有三个部分(整数部分、小数部分和指数部分)。如果存在小数部分,则它是<code>float</code>,但如果它不存在,则当一个指数部分紧随其后时,该数字仍然可以是一个浮点数。在</p>
<p>这意味着我们首先必须在regex中使这三个部分都是可选的。但是,我们需要建立规则,精确地指定哪些部分需要在那里,以使一个有效的浮动。在</p>
<p>幸运的是,有一个技巧可以让我们做到这一点。空的捕获组(<code>()</code>)总是匹配(空字符串)。对该组(<code>\1</code>)的反向引用只有在该组参与匹配时才会成功。通过在每个可选组中插入<code>()</code>,我们可以稍后测试所需的部分是否参与了匹配。在</p>
<p>例如,在Python中:</p>
^{pr2}$
<p>测试套件:</p>
<pre><code>>>> [match.group(0) for match in
... regex.finditer("1 1.1 .1 1. 1e1 1.04E-1 -.1 -1. e1 .1e1")]
['1.1', '.1', '1.', '1e1', '1.04E-1', '-.1', '-1.', '.1e1']
</code></pre>