Python:不按顺序使用find函数

时间:2012-10-30 22:04:13

标签: python operator-keyword operator-precedence

因此,下面的代码采用一串输入信息(数学表达式),并使用find函数查找“* / + - ”中的一个运算符,并相应地分离字符串。

def splitting1(z):
    for operators in "*/+-":
        if operators in z:
            position1= z.find(operators)
            position2= z.rfind(operators)
            text_before_operators= (z[:position1]).strip()
            text_after_operators= (z[(position1+1):(position2)]).strip()
            return text_before_operators,text_after_operators

我的问题是,如果我输入了诸如3/5*7之类的表达式,那么position1会在找到*之前首先找到/。我希望代码将'position1'与最左边的运算符相关联。使用for / in函数时有没有办法省略运算符优先级?如果没有,是否有更好的字符串操纵器可以省略优先顺序。

注意z是输入。并且输入仅限于两个操作符,以防止产生歧义。

2 个答案:

答案 0 :(得分:0)

你正在迭代*/+-,所以找到的第一个字符是第一个返回的字符。

您基本上想要找到所有这些运算符的索引,然后找到最大或最小的运算符。尝试重写此函数以适用于字符串的另一面:

def find_operator_right(text):
    position = -1

    for oper in '*/+-':
        index = text.rfind(oper)

        if index > position:
            position = index

    return position

稍微多一点的Pythonic解决方案就是这样的:

right_index = max(map(text.rfind, '+-/*'))

答案 1 :(得分:0)

看起来你正在努力学习lex,所以我建议你研究专为此目的而设计的模块,例如ply

说这个,我认为你在这个例子中走的是正确的轨道,但你错过了一些递归(为这些做一个更通用的词法分析器):

def splitting1(z):
    for char in "*/+-":
        if char in z:
            position = z.find(char)
            text_before_operator= (z[:position]).strip()
            text_after_operator= (z[position+1:]).strip()
            return (char, splitting1(text_before_operator), splitting1(text_after_operator))
    return ("number", z)

找到最左边的运算符而不管优先级(即省略运算符优先级)的一种方法是重新排列迭代的内容:

def splitting2(z):
    for char in z:
        if char in "*/+-":
            position = z.find(char)
            text_before_operator= (z[:position]).strip()
            text_after_operator= (z[position+1:]).strip()
            return (char, splitting2(text_before_operator), splitting2(text_after_operator))
    return ("number", z)

请注意,这些函数会向原始函数返回不同的结果。