import re
def expand(alg):
def inv_move(m):
return m if m.endswith('2') else m[:-1] if m.endswith("'") else m+"'"
def inv(alg):
return ' '.join(inv_move(m) for m in reversed(alg.split()))
def foo(m):
A, op, B = m.groups()
return ' '.join([A, B, inv(A)] + ([inv(B)] if op == ',' else []))
prev = None
while alg != prev:
prev, alg = alg, re.sub(r"\[\s*([^][,:]+)\s*([,:])\s*([^][,:]+)\s*]", foo, alg)
return alg
print(expand("[R' D R,[U:L]]"))
aW1wb3J0IHJlCgpkZWYgZXhwYW5kKGFsZyk6CiAgICAKICAgIGRlZiBpbnZfbW92ZShtKToKICAgICAgICByZXR1cm4gbSBpZiBtLmVuZHN3aXRoKCcyJykgZWxzZSBtWzotMV0gaWYgbS5lbmRzd2l0aCgiJyIpIGVsc2UgbSsiJyIKICAgIGRlZiBpbnYoYWxnKToKICAgICAgICByZXR1cm4gJyAnLmpvaW4oaW52X21vdmUobSkgZm9yIG0gaW4gcmV2ZXJzZWQoYWxnLnNwbGl0KCkpKQogICAgZGVmIGZvbyhtKToKICAgICAgICBBLCBvcCwgQiA9IG0uZ3JvdXBzKCkKICAgICAgICByZXR1cm4gJyAnLmpvaW4oW0EsIEIsIGludihBKV0gKyAoW2ludihCKV0gaWYgb3AgPT0gJywnIGVsc2UgW10pKQoKICAgIHByZXYgPSBOb25lCiAgICB3aGlsZSBhbGcgIT0gcHJldjoKICAgICAgICBwcmV2LCBhbGcgPSBhbGcsIHJlLnN1YihyIlxbXHMqKFteXVssOl0rKVxzKihbLDpdKVxzKihbXl1bLDpdKylccypdIiwgZm9vLCBhbGcpCiAgICByZXR1cm4gYWxnCgpwcmludChleHBhbmQoIltSJyBEIFIsW1U6TF1dIikp