在python数学比较器上分割一个字符串

时间:2013-11-20 02:01:00

标签: python regex

所以,我在这里问一些琐碎的问题。 我有这个字符串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)

3 个答案:

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