Skip to content

Instantly share code, notes, and snippets.

@fahaddaniyal
Created September 21, 2016 10:06
Show Gist options
  • Save fahaddaniyal/1a1ec377c3a02903d400cb3de88899e9 to your computer and use it in GitHub Desktop.
Save fahaddaniyal/1a1ec377c3a02903d400cb3de88899e9 to your computer and use it in GitHub Desktop.
from pyparsing import *
import string
from sympy import symbols
def getvars(opslist, varlist,vars):
for i in opslist:
if isinstance(i, basestring) and i in ("&", "|"):
continue
if isinstance(i, list):
getvars(i, varlist,vars)
else:
v = vars[len(varlist.keys())]
varlist[i] =v
vars.remove(v)
return 0
def foo(inp):
inp = inp.replace("*", "&").replace("+", "|")
enclosed = Forward()
nestedParens = nestedExpr('(', ')', content=enclosed)
up = ''.join(set(filter(lambda x: x not in '()|" &', inp))).decode('latin-1').encode('utf-8')
enclosed << (Word(up) | '&' | '|' | nestedParens | Suppress("2016"))
# enclosed << ( Word(alphanums) | Word(alphas + up) | Word(nums) | '&' | '|' | nestedParens)
vars = []
for g in range(1, 6):
vars += list("{}0{}".format(i, g) for i in string.ascii_uppercase)
ninp = "(" + inp + ")"
opslist = enclosed.parseString(ninp).asList()
varlist = {}
getvars(opslist, varlist, vars)
varlist = {i[0]: i[1] for i in varlist.items()}
for v in sorted(varlist, key=len, reverse=True): # Through keys sorted by length
ninp = ninp.replace(v, varlist[v])
x = '{}=symbols("{}")'.format(",".join(varlist[v] for v in varlist), " ".join(varlist[v] for v in varlist))
exec x in globals(), locals()
exp = str(eval(ninp.replace("&", "*").replace("|", "+")).expand())
for v in varlist:
exp = exp.replace(varlist[v], v)
return "{}".format(" + ".join(["({})".format(i.strip()) if "*" in i else "{}".format(i.strip()) for i in exp.split("+")])).strip().replace("*", " * ")
my_str = ['("word 1" + "word 2") * "word 3"',
'("word 1" + "word 2") * ("word 3" + "word 4")',
'(("word 1" + "word 2") * ("word 3" + "word 4")) * "word 5"',
]
a = []
for i in my_str:
a.append(foo(i))
print a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment