标记化数学表达式

时间:2016-12-23 21:23:38

标签: python tokenize

我在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代码正常工作。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您需要注意返回的令牌的类型,并对令牌数组进行预处理以获得所需的内容。在您的示例中,3x产生NUMBER,后跟一个NAME令牌。插入隐含的OP令牌,您就走了。