need some regular expression help

bearophileHUGS at lycos.com bearophileHUGS at lycos.com
Sun Oct 8 12:08:30 CEST 2006


Tim Chase:
> It still doesn't solve the aforementioned problem
> of things like ')))((('  which is balanced, but psychotic. :)

This may solve the problem:

def balanced(txt):
    d = {'(':1, ')':-1}
    tot = 0
    for c in txt:
        tot += d.get(c, 0)
        if tot < 0:
            return False
    return tot == 0

print balanced("42^((2x+2)sin(x)) + (log(2)/log(5))") # True
print balanced("42^((2x+2)sin(x) + (log(2)/log(5))") # False
print balanced("42^((2x+2)sin(x))) + (log(2)/log(5))") # False
print balanced(")))(((") # False

A possibile alternative for Py 2.5. The dict solution looks better, but
this may be faster:

def balanced2(txt):
    tot = 0
    for c in txt:
        tot += 1 if c=="(" else (-1 if c==")" else 0)
        if tot < 0:
            return False
    return tot == 0

Bye,
bearophile




More information about the Python-list mailing list