Balanced smileys check algorithm (part 4)
Correctness

I suggest you add a test to verify(':):)(():(:(', False).  Perhaps your counters need to be reset?

Algorithm

The great thing about your algorithm is its simplicity.  However the algorithm now requires scanning the loop twice. The problem can be evaluated in a single pass with a different strategy, should you wish to consider performance.

Coding

Consider whether every line in your algorithm is actually relevant to the result.  Specifically, if you don't use smile in the first loop or frown in the second loop, why count them?

Beyond that and the stylistic comments I made previously, you might sit back in your chair and scan your solution.  Where the meaning, intent and motivation are unclear you might consider augmenting it by variable name selection and with comments.

Alternate Strategy

As an example of an alternate strategy that only requires scanning once, you might 


keep a count of unpaired parens, opt_open, opt_close
borrow from opt_open as needed to pair with excess close parens
ensure opt_close never exceeds unpaired parens count since those are out of scope
ensure final unpaired parens count does not exceed opt_close

def check_balance(src):
    opt_open = opt_close = 0
    count = 0
    has_eyes = False

    for char in src:
        if char == '(':
            if has_eyes:
                opt_open += 1
            else:
                count += 1

        elif char == ')':
            if has_eyes:
                opt_close += 1
            elif count &gt; 0:
                count -= 1
            # if needed pair with an optional parens
            elif opt_open &gt; 0:
                opt_open -= 1
            else:
                return False

        if opt_close &gt; count:
            opt_close = count

        has_eyes = (char == ':')
    return count &lt;= opt_close