使用python中的regex检查表达式是否有效

时间:2015-12-12 20:44:06

标签: python regex

我正在尝试检查字符串是否是有效的数学表达式。允许的操作是+, - ,*,/和^。我试过这个,不知道为什么它不起作用:

a = raw_input("Unesite izraz")
if len( re.findall(r'(\d+(?:.\d+)?(?: [\+\-\/\*\^]\d+(?:.\d+) )* )', a ) ) != 0:

但是这个正则表达式表达式返回有效表达式的[]。为什么?谢谢!

3 个答案:

答案 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