Wijaya Edward wrote: > Hi, > > Given this list: > > list = ['0123', '1A34' , '333-' , '' ] > > I want to match only this element > '0123' (pure numeric) and '' (empty element). > > Why this construct doesn't work? > > p = re.compile("''+|[0-9]+") > m = p.match(word) > if m: > print word, > > Namely it doesn't print 0123 and ''. > What's wrong with my regex? > The first mistake is to assume that the single quotes are a part of the strings - they aren't. The second mistake was to over-complicate the pattern. All you actually need to match is zero or more digits - but you need a "$" at the ned of the pattern to make sure all the target string has been consumed in the match (otherwise *anything* will match, since all strings begin with zero or more digits). Here's my test:
>>> import re >>> list = ['0123', '1A34' , '333-' , '' ] >>> p = re.compile("\d*$") >>> for word in list: ... if p.match(word): ... print "[%s]" % word ... [0123] [] >>> There is, however, an old saying to the effect that if you try to solve a problem with regular expressions you then have *two* problems. If this isn't just a learning exercise then consider: >>> for word in list: ... if word.isdigit() or not word: ... print "[%s]" % word ... [0123] [] >>> less-to-go-wrong-is-always-good-ly y'rs - steve -- Steve Holden +44 150 684 7255 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://holdenweb.blogspot.com Recent Ramblings http://del.icio.us/steve.holden -- http://mail.python.org/mailman/listinfo/python-list