对于我的想法,是否有更清晰的正则表达式?

时间:2017-11-08 20:05:21

标签: python regex python-3.x

我只需接受输入为数字值0 to 100integersfloats,其中包含 max two小数位,并且写一个正则表达式来检查这些条件。

例如,我希望它接受以下值:

0(min), 0.1, 1, 11, 11.1, 11.11, 100(max).

但不是以下任何一种:

-1, 100.1, 111, 1+1, .1, etc.

到目前为止,我提出了^\d?\d+(\.\d\d?)?$,但它有很多问题。

刚才提交此内容时,我在类似问题边栏中看到了这个link,其中包含似乎是解决方案("^((?:|0|[1-9]\d?|100)(?:\.\d{1,2})?)$")的内容,除了它还接受100.01到{{ 1}}。除此之外,这是一个非常小的问题,它应该有效。

但有人知道如何修补那个特定的位吗?

4 个答案:

答案 0 :(得分:5)

100是唯一真正的例外,所以它应该相当简单:

^(?:100|\d{1,2}(?:\.\d{1,2})?)$

https://regex101.com/r/Rr0gs4/1

修改:还允许100.0100.00

^(?:100(?:\.00?)?|\d{1,2}(?:\.\d{1,2})?)$

答案 1 :(得分:5)

根据您获得输入的方式,简单地检查数值可能更容易,更快捷。

def acceptable(str_val):
    try:
        return 0 <= float(str_val) <= 100
    except ValueError:
        return False

acceptable('1.11')
# True

acceptable('abc')
# False

acceptable('100.0')
# True

acceptable('100.1')
# False

答案 2 :(得分:1)

这将测试所有允许的输入和示例不允许的输入。

import re

regex = re.compile(r'^(100(\.00?)?|((\d|[1-9]\d)(\.\d\d?)?))$')

def matches(s):
    print('Testing', s)
    return bool(regex.search(s))

for i in range(0, 101):
    s = str(i)
    assert matches(s), 'no match for %s' % s

for i in range(0, 100):
    for j in range(0, 100):
        s = '{i}.{j}'.format(i=i, j=j)
        assert matches(s), 'no match for %s' % s

        # Special case for .0N (e.g., 1.01, 1.02, etc)
        if j == 0:
            for k in range(0, 10):
                s = '{i}.0{k}'.format(i=i, k=k)
                assert matches(s), 'no match for %s' % s

non_matches = ('-1', '100.1', '111', '1+1', '.1', 'abc')
for s in non_matches:
    assert not matches(s), 'unexpected match for %s' % s

答案 3 :(得分:0)

试试这个re.match(r'(\d{,2}\.?\d*)?|(100)?', 'string_goes_here')