所以,我在这里问一些琐碎的问题。 我有这个字符串filterE,我想在有效的数学比较器上打破filterE。
filterE = "x.y.prop1 ==== 1 and x.y.prop2 >= 2 and x.y.prop1 < 3 or x.y.prop4 > 9"
我想过使用像re.split(r'(=(?=)|<|<(?=)|>|>(?=)|!(?=))', filterE)
这样的东西,但它根本没用。
这是我的代码片段
import re
pfe = re.split(r'(==|<|<=|>|>=|!=)', filterE)
Desired_op>>> ['x.y.prop1 ==== 1 and x.y.prop2', '>=', '2 and x.y.prop1', '<', '3 or x.y.prop4' ,'>' ,'9']
Compiled_op>>> ['x.y.prop1 ', '==', '', '==', ' 1 and x.y.prop2 ', '>', '= 2 and x.y.prop1 ', '<', ' 3 or x.y.prop4 ', '>', ' 9']
pfe = re.split(r'(=(?=)|<|<(?=)|>|>(?=)|!(?=))', filterE)
Compiled_op>>> ['x.y.prop1 ', '=', '', '=', '', '=', '', '=', ' 1 and x.y.prop2 ', '>', '', '=', ' 2 and x.y.prop1 ', '<', ' 3 or x.y.prop4 ', '>', ' 9']
我希望过滤器只能在'&lt; =','==','&gt; =','&gt;'上拆分, '&LT;'和'!='所以我做了这个正则表达式但工作正常。
pfe = re.split(r'(=(?<==)|<|<(?<==)|>|>(?<==)|!(?<==))', filterE)
答案 0 :(得分:2)
在@ Anthony的回答中添加否定的前瞻和负面的背后隐藏
>>> import re
>>> filterE = "x.y.prop1====1 and x.y.prop2>=2 and x.y.prop1<3 or x.y.prop4>9"
>>> re.split(r'((?<!=)==(?!=)|<=|>=|!=|<|>)', filterE)
['x.y.prop1====1 and x.y.prop2', '>=', '2 and x.y.prop1', '<', '3 or x.y.prop4', '>', '9']
答案 1 :(得分:1)
你只需要改善一下
>>> pfe = re.split(r'(==*|<=|>=|!=|<|>)', filterE)
>>> pfe # match your Desired_op
['x.y.prop1 ', '====', ' 1 and x.y.prop2 ', '>=', ' 2 and x.y.prop1 ', '<', ' 3 or x.y.prop4 ', '>', ' 9']
注意'*'的位置和'&lt;'的符号和'&gt;'在正则表达式
答案 2 :(得分:1)
如果您的比较器总是被空格包围,只需执行
re.split(r'\s(==|<|<=|>|>=|!=)\s', filterE)
否则,说它看起来像:
filterE = "x.y.prop1====1 and x.y.prop2>=2 and x.y.prop1<3 or x.y.prop4>9"
然后你可以使用前瞻断言,如:
re.split(r'(?<=\s|[^=<>])(==|<|<=|>|>=|!=)(?=\s|[^=<>])', filterE)
# ['x.y.prop1====1 and x.y.prop2', '>=', '2 and x.y.prop1', '<', '3 or x.y.prop4', '>', '9']