0

因此,下面的代码采用一串输入信息(数学表达式),并使用 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*7thenposition1会在 find*之前先找到/。我希望代码将“position1”与最左边的运算符相关联。使用 for/in 函数时有没有办法省略运算符优先级?如果没有,是否有更好的字符串操纵器可以省略优先顺序。

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

4

2 回答 2

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, '+-/*'))
于 2012-10-30T22:11:43.577 回答
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)

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

于 2012-10-30T22:27:38.750 回答