Python中的正则表达式匹配数字

时间:2016-01-14 12:43:14

标签: python regex

我有一个间隔(0;1]的数字列表。例如:

0.235
0.4
1.00
0.533
1

我需要在列表中添加一些新数字。要检查新数字的正确性,我需要编写正则表达式

首先我编写简单的正则表达式:[0|1\.]{2}\d+,但它忽略了一个条件:如果整数部分为1,则小数部分必须包含0或更多的零

因此,我尝试使用前瞻断言来模拟if-else条件:(?([0\.]{2})\d+|[0]+),但它不起作用。我的错误在哪里?如何提供检查,没有数字不能超过1?

2 个答案:

答案 0 :(得分:5)

优于正则表达式是尝试将字符串转换为浮点数并检查它是否在范围内:

def convert(s):
    f = float(s)
    if not 0. < f <= 1.:
        raise ValueError()
    return f

此方法返回0到1之间的浮点数,或者它引发一个ValueError(如果无效字符串或浮点数不在0和1之间)

答案 1 :(得分:3)

从上面解释我的评论:

你想要的正则表达式应该是:

"1 maybe followed by only 0's" OR "0 followed by a dot then some more numbers, which aren't all zeroes"

这样打破它会使写作更容易。

对于第一部分&#34; 1之后可能只有0&#34;&#34;:

^1(\.0+)?$

这非常简单。 &#34; 1&#34;然后是(.0 +)零次或一次。其中(.0 +)是&#34;。&#34;然后是一个或多个&#34; 0&#34;&#39; s。

第二部分

^0\.(?!0+$)\d+$

这有点棘手。它是&#34; 0。&#34;然后是先行&#34;(?!0 + $)&#34;。这意味着如果&#34; 0 + $&#34; (=&#34; 0&#34;在字符串结尾之前一次或多次)被发现它不匹配。在那次检查之后你有&#34; \ d + $&#34;,这是数字,一次或多次。

将这些结合起来或者你得到:

^1(\.0+)?$|^0\.(?!0+$)\d+$