re.split多个字符(并维护字符)会产生一个包含空字符串的列表

时间:2016-01-15 23:53:01

标签: python regex string split

我需要根据分隔符拆分数学表达式。分隔符为()+-*/^和空格。我提出了以下正则表达式

"([\\s\\(\\)\\-\\+\\*/\\^])"

还将分隔符保留在结果列表中(这是我想要的),但它也会产生空字符串""元素,这是我不想要的。我很难使用正则表达式(不幸的是),所以我不确定是否可以避免这种情况。

以下是问题的一个示例:

>>> import re
>>> e = "((12*x^3+4   * 3)*3)"
>>> re.split("([\\s\\(\\)\\-\\+\\*/\\^])", e)
['', '(', '', '(', '12', '*', 'x', '^', '3', '+', '4', 
' ', '', ' ', '', ' ', '', '*', '', ' ', '3', ')', '', '*', '3', ')', '']

有没有办法不通过修改我的正则表达式来产生那些空字符串?当然我可以使用例如过滤器删除它们,但是想法根本就不会产生它们。

修改

我还需要不包含空格。如果你能在这方面也提供帮助,那就太好了。

2 个答案:

答案 0 :(得分:1)

您可以添加\w+,删除\ s并执行findall:

import re
e = "((12*x^3+44   * 3)*3)"
print  re.findall("(\w+|[()\-+*/^])", e)

输出:

['(', '(', '12', '*', 'x', '^', '3', '+', '44', '*', '3', ')', '*', '3', ')']

根据您的需要,您可以更改正则表达式:

e = "((12a*x^3+44   * 3)*3)"

print re.findall("(\d+|[a-z()\-+*/^])", e)
print re.findall("(\w+|[()\-+*/^])", e)

第一个认为12a是后两个字符串:

['(', '(', '12', 'a', '*', 'x', '^', '3', '+', '44', '*', '3', ')', '*', '3', ')']
['(', '(', '12a', '*', 'x', '^', '3', '+', '44', '*', '3', ')', '*', '3', ')']

答案 1 :(得分:-1)

只需理解即可剥离/过滤它们。

result = [item for item in re.split("([\\s\\(\\)\\-\\+\\*/\\^])", e) if item.strip()]