我正在尝试获取以下正则表达式:
^([1-9][0-9]?)(\.[0-9])?$
验证以下内容:
1 <-- MATCHES
1.5 <-- MATCHES
10 <-- MATCHES
10.5 <-- MATCHES
102 <-- DOES NOT MATCH, BUT SHOULD
并且不验证以下内容:
0 <-- DOES NOT MATCH, AND SHOULDN'T
0. <-- DOES NOT MATCH, AND SHOULDN'T
0.5 <-- DOES NOT MATCH, AND SHOULDN'T
0.55 <-- DOES NOT MATCH, AND SHOULDN'T
102. <-- DOES NOT MATCH, AND SHOULDN'T
102.5 <-- DOES NOT MATCH, AND SHOULDN'T
102.55 <-- DOES NOT MATCH, AND SHOULDN'T
我得到的最接近的是上面的正则表达式,除了匹配项102外,它目前可以进行其他所有操作。我会提前致歉,我对正则表达式了解不多。
我考虑过使用从小数点开始的负向和正向查找(如果存在)。小数点前最多2位,小数点后最多1位。如果没有小数,则测试一个最多三个位置的整数。
进一步的解释:
我正在处理的脚本正在使用正则表达式使用QRegExpValidator
而不是QDoubleValidator
或QIntValidator
来验证输入,因为这两个都接受+/-
作为潜在条目,这已经引起了一些问题。
我的QLineEdit
框之一可以是双精度或整数。条目长度必须为一到三位数,并且不能为小数,或者必须为一到两位数,而不能以0,十进制和一位开头。
答案 0 :(得分:2)
您可以使用与3个数字[1-9][0-9]{2}
匹配的alternation或与您尝试过的正则表达式以及与点和一位数字匹配的可选部分进行匹配。
^(?:[1-9][0-9]{2}|[1-9][0-9]?(?:\.[0-9])?)$
说明
^
声明字符串的开头(?:
非捕获组
[1-9][0-9]{2}
匹配一个1-9的数字,然后匹配两个0-9的数字|
或[1-9][0-9]?
匹配一个1-9的数字,后跟一个可选数字(?:\.[0-9])?
可选的非捕获组,其与点和数字0-9匹配)
关闭非捕获组$
声明字符串的结尾答案 1 :(得分:0)
根据您所说的话:
条目要么必须是三位数字,大于100,并且没有小数位,要么必须是两位数,十进制和一位数字。
您可以尝试以下模式:
(^[1-9]\d{1,2}$)|(^[1-9]$)|(^[1-9]\d?\.[1-9]$)
|
是逻辑OR
,因此这实际上是在检查三种独立的模式:
(^[1-9]\d{1,2}$)
:2或3位的任意数字,但以0
开头的数字除外(^[1-9]$)
:除0
之外的任意一位(^[1-9]\d?\.[1-9]$)
:任何由1或2位数字组成的序列(只要第一个不是0
),其后是.
,而恰好不是{{ 1}} 每一个都由0
(字符串的开头)和^
(字符串的结尾)包装。
如果您不需要使用正则表达式,则可以执行以下操作:
$
测试您的值:
def match(s):
if any(not c.isdigit() and c != "." for c in s):
return False
if "." not in s:
return 0 < int(s) < 1000
elif s.count(".") == 1:
before, after = s.split(".")
before_good = (len(before) <= 2 and int(before) != 0)
after_good = (len(after) == 1 and int(after) != 0)
return before_good and after_good
else:
return False
答案 2 :(得分:-1)
此模式应该可以解决问题:^[1-9]\d?(?!\.$)\.?\d?$
以下是细分:
^[1-9]
意味着它必须以该范围内的数字开头
\d?
是一个可选数字0-9
(?!\.$)
表示如果后面跟.
和该行的末尾将不匹配。这样可以防止这样的结果匹配:99.
\.?
与可选的.
\d?$
是另一个可选数字0-9,后跟比赛结束
在这种情况下,由于.
是可选的,并且最多3位数字,因此无需使用or或|