我有字符串变量,如:
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)
,但我不确定这是一个很好的解决方案。
答案 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