我正在编写一个解析器,而不是将LaTeX数学转换为与 pythoneval()兼容的字符串。
我得到了一个看起来像这样的字符串:
\sqrt{4m/s} - \frac{3v+10.5v}{20a-8a} +1/2
请注意仍然主要的LaTeX语法,以及一些任意的“单位”字母。然后我使用以下否定集来替换除否定集中的内容之外的所有内容。
mathstr = re.sub('[^0-9*()/+\-.Q]','',mathstr)
我如何包含一个子字符串“sqrt”,以便它可以以类似的方式工作,最好是在相同的正则表达式中?
现在我的工作是用 ' \sqrt'替换 ' ' Q,执行上面的代码行,然后将 ' Q'设置为 ' sqrt',我从上述语法到eval()语法的完整例程如下:
mathstr = mathstr.replace(" ","")
if pwrRe.search(mathstr):
mathstr = re.sub(pwrRe,'**',mathstr)
if MultiplyRe.search(mathstr):
mathstr = re.sub(MultiplyRe,'*',mathstr)
if DivideRe.search(mathstr) or sqrtRe.search(mathstr):
mathstr = re.sub('\\\\frac{','(',mathstr)
mathstr = re.sub('\\\\sqrt{','\\\\sqrt(',mathstr)
mathstr = re.sub('}{',')/(',mathstr)
mathstr = re.sub('}',')',mathstr)
mathstr = re.sub('[/*+\-^][a-zA-Z]','',mathstr)
mathstr = re.sub('\\\\sqrt','Q',mathstr)
mathstr = re.sub('[^0-9*()/+\-.Q]','',mathstr)
mathstr = re.sub(r'Q','sqrt',mathstr)
这导致eval()语法'd:
sqrt(4)-(3+10.5)/(20-8)+1/2
但这是草率的,如果我可以在一行中“白名单”字符和子字符串,将所有其他出现的字符吹走,那么它在许多领域都会很有用。
相关分类