使用否定集 [^] 和什么?否定同一行中的子字符串

我正在编写一个解析器,而不是将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

但这是草率的,如果我可以在一行中“白名单”字符和子字符串,将所有其他出现的字符吹走,那么它在许多领域都会很有用。


温温酱
浏览 200回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python