Balanced smileys check algorithm
A couple of minor style points:



In check_balance() the return can be simplified from:

if len(stack) &gt; 0:
    return False
return True


to:        

return len(stack) &lt;= 0




In generate_balance_string() there is a long if/elif string.  But the first
element does not follow the pattern and has an embedded return it does not need.
You can drop the return and make the following if an elif to make your code more uniform: 

def generate_balance_string(source, index, prefix, result):
    if index &gt;= len(source):
        result.append(prefix[:])
    elif source[index] == ':' and source[index + 1] == '(':
        ...