Python 在多个字符上重新拆分(并维护这些字符)会生成一个也包含空字符串的列表

Python 在多个字符上重新拆分(并维护这些字符)会生成一个也包含空字符串的列表,python,regex,string,split,Python,Regex,String,Split,我需要根据分隔符拆分一个数学表达式。分隔符是(,),+,-,*,/,^和空格。我想出了下面的正则表达式 "([\\s\\(\\)\\-\\+\\*/\\^])" 它还将分隔符保留在结果列表中(这是我想要的),但它也会生成空字符串“元素,这是我不想要的。我很少使用正则表达式(不幸的是),所以我不确定是否可以避免这种情况 下面是一个问题示例: >>> import re >>> e = "((12*x^3+4 * 3)*3)" >>> re

我需要根据分隔符拆分一个数学表达式。分隔符是
+
-
*
/
^
和空格。我想出了下面的正则表达式

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

下面是一个问题示例:

>>> import re
>>> e = "((12*x^3+4   * 3)*3)"
>>> re.split("([\\s\\(\\)\\-\\+\\*/\\^])", e)
['', '(', '', '(', '12', '*', 'x', '^', '3', '+', '4', 
' ', '', ' ', '', ' ', '', '*', '', ' ', '3', ')', '', '*', '3', ')', '']
有没有办法不产生这些空字符串,或者通过修改正则表达式?当然,我可以使用例如filter删除它们,但我的想法是根本不生成它们

编辑


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

只需在理解中去掉/过滤掉它们

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

只需在理解中去掉/过滤掉它们

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

您可以添加
\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', ')']

您可以添加
\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', ')']

我没有投反对票。我只是想用正则表达式来做,但如果我真的没有做到这一点,那么我会采取与你建议的类似的方法……我没有投反对票。我只是想用正则表达式来做,但如果我真的没有这样做,那么我会采取与你建议的类似的方法…很好,这正是我想要得到的!让我试着理解正则表达式的意思。我们有两组字符,一组包含操作数(和括号),另一组包含数字和/或单词,对吗?第一组后面的
+
表示它可以将一个数字或一个单词与多个符号匹配。但它也会匹配
12a
,对吗?@nbro,是的,这取决于您的输入是什么样的,我认为这是一个学习练习还是其他什么?嗯,我想解析这类表达式,但我几乎没有使用regex的练习(正如我在问题中所说的)。。实际上,显然执行
[\w\d]+
\w+
会产生相同的输出,似乎
w
也匹配数字…@nbro,我的意思是使用
[a-z]
而不是\w,我添加了一个不同的方法,该方法将与
12a
的行为不同example@nbro,不用担心,我在那里整理正则表达式,您只需转义字符集中的-即可,因为它具有特殊含义。是的,你也可以使用
re.I
re.findall(r“(\d+[a-z()\-+*/^]),e,re.I)
一个案例,这正是我想要的!让我试着理解正则表达式的意思。我们有两组字符,一组包含操作数(和括号),另一组包含数字和/或单词,对吗?第一组后面的
+
表示它可以将一个数字或一个单词与多个符号匹配。但它也会匹配
12a
,对吗?@nbro,是的,这取决于您的输入是什么样的,我认为这是一个学习练习还是其他什么?嗯,我想解析这类表达式,但我几乎没有使用regex的练习(正如我在问题中所说的)。。实际上,显然执行
[\w\d]+
\w+
会产生相同的输出,似乎
w
也匹配数字…@nbro,我的意思是使用
[a-z]
而不是\w,我添加了一个不同的方法,该方法将与
12a
的行为不同example@nbro,不用担心,我在那里整理正则表达式,您只需转义字符集中的-即可,因为它具有特殊含义。是的,您也可以使用
re.I
re.findall(r“(\d++[a-z()\-+*/^]),e,re.I)
一个案例插入的匹配