我正在编写一个解析器,而不是将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但这是草率的,如果我可以在一行中“白名单”字符和子字符串,将所有其他出现的字符吹走,那么它在许多领域都会很有用。
添加回答
举报
0/150
提交
取消