2 回答
TA贡献1886条经验 获得超2个赞
您的正则表达式始终匹配,因为它允许空字符串匹配(因为整个正则表达式都包含在一个可选组中。
如果您在 regex101.com 上对此进行实时测试,您可以立即看到这一点,并且它不匹配整个字符串,而只匹配其中的一部分。
我已经更正了字符类中关于使用不必要/有害的交替运算符 ( |) 和不正确放置破折号的两个错误,使其成为范围运算符 ( -),但它仍然不正确。
我想你想要更像这样的东西:
^ # Make sure the match begins at the start of the string
(?: # Start a non-capturing group that matches...
-? # an optional minus sign,
\d+ # one or more digits
(?:\.\d+)? # an optional group that contains a dot and one or more digits.
(?: # Start of a non-capturing group that either matches...
[+*/-] # an operator
| # or
$ # the end of the string.
) # End of inner non-capturing group
)+ # End of outer non-capturing group, required to match at least once.
(?<![+*/-]) # Make sure that the final character isn't an operator.
$ # Make sure that the match ends at the end of the string.
TA贡献1789条经验 获得超8个赞
这回答了您关于如何将 if 与 regex 一起使用的问题:
注意:regex 公式不会清除所有无效输入,例如,两个小数点 ("..")、两个运算符 ("++") 等。所以请调整它以满足您的确切需求)
import re
regex = re.compile(r"[\d.+\-*\/]+")
input_list = [
"53.22+22.11+10*555+62+55.2-66", "a53.22+22.11+10*555+62+55.2-66",
"53.22+22.pq11+10*555+62+55.2-66", "53.22+22.11+10*555+62+55.2-66zz",
]
for input_str in input_list:
mmm = regex.match(input_str)
if mmm and input_str == mmm.group():
print('Valid: ', input_str)
else:
print('Invalid: ', input_str)
以上作为用于单个字符串而不是列表的函数:
import re
regex = re.compile(r"[\d.+\-*\/]+")
def check_for_valid_string(in_string=""):
mmm = regex.match(in_string)
if mmm and in_string == mmm.group():
return 'Valid: ', in_string
return 'Invalid: ', in_string
check_for_valid_string('53.22+22.11+10*555+62+55.2-66')
check_for_valid_string('a53.22+22.11+10*555+62+55.2-66')
check_for_valid_string('53.22+22.pq11+10*555+62+55.2-66')
check_for_valid_string('53.22+22.11+10*555+62+55.2-66zz')
输出:
## Valid: 53.22+22.11+10*555+62+55.2-66
## Invalid: a53.22+22.11+10*555+62+55.2-66
## Invalid: 53.22+22.pq11+10*555+62+55.2-66
## Invalid: 53.22+22.11+10*555+62+55.2-66zz
添加回答
举报