我正在尝试检查字符串是否是有效的数学表达式。允许的操作是+, - ,*,/和^。我试过这个,不知道为什么它不起作用:
a = raw_input("Unesite izraz")
if len( re.findall(r'(\d+(?:.\d+)?(?: [\+\-\/\*\^]\d+(?:.\d+) )* )', a ) ) != 0:
但是这个正则表达式表达式返回有效表达式的[]。为什么?谢谢!
答案 0 :(得分:1)
你在错误的地方有空位。
# yours / fixed
r'(\d+(?:.\d+)?(?: [\+\-\/\*\^]\d+(?:.\d+) )* )'
r'(\d+(?:.\d+)?(?: [\+\-\/\*\^] \d+(?:.\d+) )*)'
您可以在pythex.org
上试用它们答案 1 :(得分:1)
您可以简化正则表达式。
运营商“除了”:[^abc]
因此,它将采取任何不是字符“a”,“b”或“c”。
import re
e1 = '1 + 2' # correct
e2 = '1 + 3 * 3 / 6 ^ 2' # correct
e3 = '1 + 3 x 3' # wrong
el = [e1, e2, e3]
regexp = re.compile(r'[^+\-*\/^0-9\s]')
for i in el:
if len(regexp.findall(i)):
print(i, 'wrong')
else:
print(i, 'correct')
您可以使用此网站来学习和测试您的正则表达式:https://regex101.com/
答案 2 :(得分:1)
简单符号数学表达式的验证器可能是这样的。
这将是整个字符串的1次匹配。
^\s*[+-]?\s*(?:\d+(?:\.\d*)?|\.\d+)(?:\s*[-+/*^]\s*\s*[+-]?\s*(?:\d+(?:\.\d*)?|\.\d+))*\s*$
格式化:
^ # BOS
\s* [+-]? \s* # whitespace (opt), sign (opt), whitespace (opt)
(?: # Integer or decimal
\d+
(?: \. \d* )?
| \. \d+
)
(?: # Cluster group
\s* [-+/*^] \s* # whitespace (opt), operation symbol (req'd), whitespace (opt)
\s* [+-]? \s* # whitespace (opt), sign (opt), whitespace (opt)
(?: # Integer or decimal
\d+
(?: \. \d* )?
| \. \d+
)
)* # End cluster, do 0 to many times
\s* # optional whitespace
$ # EOS