0

PythonでInfix式の評価を行うために、文字列を整数と演算子に分割したいと考えています。

これが私の文字列です:

>>> s = (1-2+3)*5+10/2

これを分割してみました:

>>>list(s)
['(', '1', '-', '2', '+', '3', ')', '*', '5', '+', '1', '0', '/', '2']

これは間違っています。「10」は「1」、「0」に分割されるため、

別の方法を試しました:

>>> re.findall('[+-/*//()]+|\d+',s)
['(', '1', '-', '2', '+', '3', ')*', '5', '+', '10', '/', '2']

これも失敗しました。')*' は ')' に分割する必要があるため、'*'

指定された式から演算子と整数を分割するのを手伝ってもらえますか?

4

4 に答える 4

7

これは infix の最適な解決策ではありません。[] の後の + を次のように削除します。

import re
s = "(1-2+3)*5+10/2"
print re.findall('[+-/*//()]|\d+',s)

['(', '1', '-', '2', '+', '3', ')', '*', '5', '+', '10', '/', '2']

正しい解決策については、次のリンクを試してください: Simple Balanced Parentheses

from pythonds.basic.stack import Stack

def postfixEval(postfixExpr):
    operandStack = Stack()
    tokenList = postfixExpr.split()

    for token in tokenList:
        if token in "0123456789":
            operandStack.push(int(token))
        else:
            operand2 = operandStack.pop()
            operand1 = operandStack.pop()
            result = doMath(token,operand1,operand2)
            operandStack.push(result)
    return operandStack.pop()

def doMath(op, op1, op2):
    if op == "*":
        return op1 * op2
    elif op == "/":
        return op1 / op2
    elif op == "+":
        return op1 + op2
    else:
        return op1 - op2

print(postfixEval('7 8 + 3 2 + /'))

これは後置実装であり、単なる例であることに注意してください。自分でインフィックスを行い、問題がある場合は質問してください。

于 2013-08-27T11:46:31.400 に答える
0

正規表現を回避できる場合は、反復ソリューションを試すことができます (大まかなコードにすぎません)。

s = "(1-2+3)*5+10/2"
numbers = "0123456789."

def split_operators(s):
    l = []
    last_number = ""
    for c in s:
        if c in numbers:
            last_number += c
        else:
            if last_number:
                l.append(last_number)
                last_number = ""
            if c:
                l.append(c)
    if last_number:
        l.append(last_number)
    return l

print split_operators(s)

結果:

['(', '1', '-', '2', '+', '3', ')', '*', '5', '+', '10', '/', '2']
于 2013-08-27T14:36:06.033 に答える
0

分割の使用:

print filter(lambda x: x, re.split(r'([-+*/()])|\s+', s))
于 2013-08-27T14:29:22.683 に答える