need some regular expression help

Tim Chase python.list at tim.thechases.com
Sat Oct 7 23:12:34 EDT 2006


> Why does it need to be a regex?  There is a very simple and well-known 
> algorithm which does what you want.
> 
> Start with i=0.  Walk the string one character at a time, incrementing i 
> each time you see a '(', and decrementing it each time you see a ')'.  At 
> the end of the string, the count should be back to 0.  If at any time 
> during the process, the count goes negative, you've got mis-matched 
> parentheses.
> 
> The algorithm runs in O(n), same as a regex.
> 
> Regex is a wonderful tool, but it's not the answer to all problems.

Following Roy's suggestion, one could use something like:

 >>> s = '42^((2x+2)sin(x)) + (log(2)/log(5))'
 >>> d = {'(':1, ')':-1}
 >>> sum(d.get(c, 0) for c in s)
0


If you get a sum() > 0, then you have too many "(", and if you 
have sum() < 0, you have too many ")" characters.  A sum() of 0 
means there's the same number of parens.  It still doesn't solve 
the aforementioned problem of things like ')))((('  which is 
balanced, but psychotic. :)

-tkc







More information about the Python-list mailing list