我在Python中使用Shunting Yard程序并遇到数学表达式的问题,例如“3x + 4 * y”或“3 sin(x)”。
问题是Python标记化函数不知道我需要“3x”变成[“3”,“*”“x”]而不仅仅是[“3”,“x”]。当然,我可以规定用户必须输入3 * x而不是3x,但这太蹩脚了。应该有一种更清洁的方法来解决这个问题。
这是我正在使用的标记化代码(从stackoverflow发布中复制):
expression="3x + 4*y"
from io import StringIO
print [token[1] for token in tokenize.generate_tokens (StringIO(expression).readline) if token[1]]
给了我:
[u'3', u'x', u'+', u'4', u'*', u'y']
但我需要:
[u'3', u'*', u'x', u'+', u'4', u'*', u'y']
以使Shunting Yard代码正常工作。
感谢您的帮助。
答案 0 :(得分:0)
您需要注意返回的令牌的类型,并对令牌数组进行预处理以获得所需的内容。在您的示例中,3x产生NUMBER,后跟一个NAME令牌。插入隐含的OP令牌,您就走了。