因此,下面的代码采用一串输入信息(数学表达式),并使用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是输入。并且输入仅限于两个操作符,以防止产生歧义。
答案 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)
请注意,这些函数会向原始函数返回不同的结果。