0

我正在尝试将运算符(包括括号)和表达式中的操作数分开。例如给定一个表达式

expr = "(32+54)*342-(4*(3-9))"

我想得到

['(', '32', '+', '54', ')', '*', '342', '-', '(', '4', '*', '(', '3', '-', '9', ')', ')']

这是我写的代码。有没有更好的方法在python中做到这一点。

l = list(expr)
n = ''
expr = []
try:
  for c in l:
    if c in string.digits:
      n += c
    else:
      if n != '':
        expr.append(n)
        n = ''
      expr.append(c)
finally:
  if n != '':
    expr.append(n)
4

4 回答 4

3

我们可以这样做re.split()

>>> import re
>>> expr = "(32+54)*342-(4*(3-9))"
>>> re.split("([-()+*/])", expr)
['', '(', '32', '+', '54', ')', '', '*', '342', '-', '', '(', '4', '*', '', '(', '3', '-', '9', ')', '', ')', '']

这确实插入了一些空字符串,但这些可能可以很容易地处理或剥离。例如,列表理解

>>> [part for part in re.split("([-()+*/])", expr) if part]
['(', '32', '+', '54', ')', '*', '342', '-', '(', '4', '*', '(', '3', '-', '9', ')', ')']
于 2012-09-22T21:48:28.367 回答
1

如果您只是尝试标记流,那么您的方法很好,但有些过时。您可以使用正则表达式,更轻松地拆分标记。

但是,如果您还想对标记做一些事情(例如评估它们),那么我建议您查看一个可以处理递归(正则表达式无法处理递归)的解析模块,例如pyparsing

于 2012-09-22T21:52:50.153 回答
1

Python:包括电池

>>> [x[1] for x in tokenize.generate_tokens(StringIO.StringIO('(32+54)*342-(4*(3-9))').readline)]
['(', '32', '+', '54', ')', '*', '342', '-', '(', '4', '*', '(', '3', '-', '9', ')', ')', '']
于 2012-09-22T21:54:11.200 回答
0
>>> if True:
    exp=[]
    expr = "(32+54)*342-(4*(3-9))"
    flag=False
    for i in expr:
        if i.isdigit() and flag:
            exp.append(str(exp.pop(len(exp)-1))+i)
        elif i.isdigit():
            flag=True
            exp.append(i)
        else:
            flag=False
            exp.append(i)
    print(exp)


['(', '32', '+', '54', ')', '*', '342', '-', '(', '4', '*', '(', '3', '-', '9', ')', ')']
>>> 
于 2012-09-22T22:44:32.420 回答