Guest User

Untitled

a guest
Mar 25th, 2023
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.08 KB | None | 0 0
  1. import re
  2. from collections import OrderedDict
  3. def latex2func(s, udict=OrderedDict()):
  4.     class make_xlat(object):
  5.         def __init__(self, *args, **kwargs):
  6.             self.adict = OrderedDict((
  7.                     (r'\left'  , ''),
  8.                     (r'\right' , ''),
  9.                     (r'\cdot'  , '*'),
  10.                     ('^'       , '**'),
  11.                     (' '       , ''),
  12.                     ('{'       , '('),
  13.                     ('}'       , ')'),
  14.                     (r'(\d+)([A-Za-z]\d*\w*)' , r'\1*\2'),
  15.                     (r'\((\d+)\)' , r'\1'),
  16.                     ))
  17.             self.adict.update(*args, **kwargs)
  18.             self.grp_lookup = self.make_grp_lookup()
  19.             self.rx = self.make_rx()
  20.         def make_grp_lookup(self):
  21.             grps = {}
  22.             for k,v in self.adict.items():
  23.                 i = max(grps.keys())+1 if grps else 0
  24.                 grps.update({i+j: k for j in range(len(re.findall(r'\\\d+', v)))})
  25.             return grps
  26.         def make_rx(self):
  27.             l = []
  28.             for k, v in self.adict.items():
  29.                 if not re.search(r'\\\d+', v):
  30.                     l.append(''.join(map(re.escape, k)))
  31.                 else:
  32.                     l.append(k)
  33.             return re.compile('|'.join(l))
  34.         def one_xlat(self, match):
  35.             try: # Simple string replacement
  36.                 return self.adict[match.group(int(0))]
  37.             except: # Subpattern group replacement
  38.                 i, m = zip(*[(i, v) for i, v in enumerate(match.groups()) if v is not None])
  39.                 t = self.adict[self.grp_lookup[i[0]]] # Assumes all indicies are the same, if not, something went wrong
  40.                 for i, g in enumerate(m):
  41.                     t = t.replace(r'\{}'.format(i+1), g)
  42.                 return t
  43.         def __call__(self, txt):
  44.             return self.rx.sub(self.one_xlat, txt)
  45.  
  46.  
  47.     translate = make_xlat(udict)
  48.     while translate(s) is not s:
  49.         s = translate(s)
  50.     s = s.split('=')
  51.     args = re.sub(r'.*\((.*)\)', r'\1', s[0])
  52.     eqn = s[1]
  53.     return eqn
Advertisement
Add Comment
Please, Sign In to add comment