基于算术和逻辑运算符python的拆分字符串

时间:2017-07-30 10:52:44

标签: python regex string

我想使用字符串中存在的算术和逻辑运算符来拆分字符串。 示例字符串如下所示,a,b,c是常量值,其值必须从数据库中获取并计算表达式并返回True或False

例如:

'a >= 10 AND b >=20 OR c<=100'

'a >=10 OR b < 100 AND c = 100'

我需要根据OR,AND,NOT或任何逻辑运算符将其拆分为

a >= 10 
b >= 20
c <= 100

并使用运算符(AND,OR)计算条件

例: a = 10,b = 25,c = 50

我需要评估10 >= 10 AND 25 >=20 OR 50 <=100并返回True

在python中有没有简单的方法呢?

2 个答案:

答案 0 :(得分:3)

您可以使用eval()执行字符串语句。例如,

eval('a >= 10 and b >=20 or c<=100')

它将评估为True id a,b和c已经定义。

注意:使用的逻辑运算符应为小写,如and而不是AND

答案 1 :(得分:1)

这是使用sympy和一些正则表达式的变体。

这将执行以下操作:

  1. 用括号
  2. 包围各个表达式a>=10
  3. ANDOR替换为&|
  4. sympify字符串以获得有效的同情表达
  5. 将您想要的任何值替换为变量
  6. 以下是代码:

    from re import sub
    from sympy import symbols, sympify
    
    a, b, c = symbols('a b c')
    
    strg = 'a >= 10 AND b >=20 OR c<=100'
    
    def repl(match):
        '''
        surround match with quotes
        '''
        return '({})'.format(match.group())
    
    strg1 = sub('([abc]\s*[<>=]+\s*\d*)', repl, strg)
    print(strg1)  # (a >= 10) AND (b >=20) OR (c<=100)
    strg2 = strg1.replace('AND', '&').replace('OR', '|')
    print(strg2)  # (a >= 10) & (b >=20) | (c<=100)
    sympy_expr = sympify(strg2)
    print(sympy_expr)  # Or(And(a >= 10, b >= 20), c <= 100)
    
    subs = {a: 10, b: 25, c: 50}
    res = sympy_expr.subs(subs)
    print(res)  # True