You should try SymPy for this:
from sympy import solve from sympy.abc import x, y e = 2*x+3-y solve(e,x)
Based on this, you can build your inverse() as (works for two variables):
def inverse(string, left_string=None): from sympy import solve, Symbol, sympify string = '-' + string e = sympify(string.replace('=','+')) if left_string: ans = left_string + ' = ' + str(solve(e, sympify(left_string))[0]) else: left = sympify(string.split('=')[0].strip().replace('-','')) symbols = e.free_symbols symbols.remove( left ) right = list(symbols)[0] ans = str(right) + ' = ' + str(solve(e, right)[0]) return ans
Examples:
inverse(' x = 4*y/2') #'y = x/2' inverse(' y = 100/x + x**2') #'x = -y/(3*(sqrt(-y**3/27 + 2500) + 50)**(1/3)) - (sqrt(-y**3/27 + 2500) + 50)**(1/3)' inverse("screeny = (isox+isoy)*29/2.0344827586206895", "isoy") #'isoy = -isox + 0.0701545778834721*screeny'
source share