我只需接受输入为数字值0 to 100
,integers
和floats
,其中包含 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}}。除此之外,这是一个非常小的问题,它应该有效。
但有人知道如何修补那个特定的位吗?
答案 0 :(得分:5)
100
是唯一真正的例外,所以它应该相当简单:
^(?:100|\d{1,2}(?:\.\d{1,2})?)$
https://regex101.com/r/Rr0gs4/1
修改:还允许100.0
和100.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')