将字符串转换为条件和语句

时间:2017-02-09 22:44:08

标签: python python-3.x

我有字符串变量,如:

s = 'apple<3,meizu>5;samsung=9,foo=bar'

和一些词典如:

 D = [  
        {'apple': 9, 'meizu': 12, 'samsung': 90, 'oppo': 12', foo': 'bar'}, 
        {'apple': 91, 'meizu': 22, 'samsung': 72, 'foo': 'test'},
         ...
     ]

我需要将s转换为

"if apple < 3 and (meizu > 5 or samsung==9) and foo=='bar'"  # (semicolon is OR, comma is AND)

并使用此条件检查列表D的每个元素,例如:

for i in D:
  if i['apple']<3 and (i['meizu']>5 or i['samsung']==9) and i['foo']=='bar':
     print ('ok')

我不明白如何实施它。我尝试了eval(s),但我不确定这是一个很好的解决方案。

1 个答案:

答案 0 :(得分:0)

您可以通过多个字符串替换来实现此目的:

  • RewriteEngine on RewriteCond %{HTTPS} =off [OR] RewriteCond %{HTTP_HOST} !=www.example.com [NC] #RewriteCond %{HTTP_HOST} !=your.dev.server [NC] RewriteCond %{THE_REQUEST} ^\S++\s++(\S++) RewriteRule ^ https://www.example.com%1 [DPI,NE,L,R=301] 替换为"="(如果您还有"=="<=,请小心)
  • 将姓名>=替换为x;你可以使用re.sub来回复此
  • d['x']替换为,,将and替换为;

棘手的部分是让or绑定比or强,但你可以通过在所有and运算符周围(以及开头和字符串的结尾),但不在and附近。 (如果字符串已包含parens,则可能会失败,但我认为这是某种没有括号的规范化形式。)

or

然后,您可以import re def to_code(string): code = "(" + string + ")" code = re.sub("[a-z]+", lambda m: "d['%s']" % m.group(0), code) code = code.replace(",", ") and (") code = code.replace(";", " or ") code = code.replace("=", "==") return code s = 'apple<3,meizu>5;samsung=9,foo=bar' code = to_code(s) # (d['apple']<3) and (d['meizu']>5 or d['samsung']==9) and (d['foo']==d['bar']) eval为不同词典的字符串。

d