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

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 に答える
1

ストリームをトークン化するだけの場合は、アプローチは問題ありませんが、やや時代遅れです。正規表現を使用して、トークンをより簡単に分割できます。

ただし、トークンを使用して何かを行いたい場合 (トークンの評価など) は、pyparsingなど、再帰を処理できる (正規表現では再帰を処理できない) 解析モジュールを検討することをお勧めします。

于 2012-09-22T21:52:50.153 に答える
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 に答える