"Summercool" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > > somebody who is a regular expression guru... how do you negate a word > and grep for all words that is > > tire > > but not > > snow tire > > or > > snowtire > > so for example, it will grep for > > winter tire > tire > retire > tired > > but will not grep for > > snow tire > snow tire > some snowtires > > need to do it in one regular expression >
What you want is a negative lookbehind assertion: >>> re.search(r'(?<!snow)tire','snowtire') # no match >>> re.search(r'(?<!snow)tire','baldtire') <_sre.SRE_Match object at 0x00FCD608> Unfortunately you want variable whitespace: >>> re.search(r'(?<!snow\s*)tire','snow tire') Traceback (most recent call last): File "<interactive input>", line 1, in <module> File "C:\dev\python\lib\re.py", line 134, in search return _compile(pattern, flags).search(string) File "C:\dev\python\lib\re.py", line 233, in _compile raise error, v # invalid expression error: look-behind requires fixed-width pattern >>> Python doesn't support lookbehind assertions that can vary in size. This doesn't work either: >>> re.search(r'(?<!snow)\s*tire','snow tire') <_sre.SRE_Match object at 0x00F93480> Here's some code (not heavily tested) that implements a variable lookbehind assertion, and a function to mark matches in a string to demonstrate it: ### BEGIN CODE ### import re def finditerexcept(pattern,notpattern,string): for matchobj in re.finditer('(?:%s)|(?:%s)'%(notpattern,pattern),string): if not re.match(notpattern,matchobj.group()): yield matchobj def markexcept(pattern,notpattern,string): substrings = [] current = 0 for matchobj in finditerexcept(pattern,notpattern,string): substrings.append(string[current:matchobj.start()]) substrings.append('[' + matchobj.group() + ']') current = matchobj.end() # substrings.append(string[current:]) return ''.join(substrings) ### END CODE ### >>> sample='''winter tire ... tire ... retire ... tired ... snow tire ... snow tire ... some snowtires ... ''' >>> print markexcept('tire','snow\s*tire',sample) winter [tire] [tire] re[tire] [tire]d snow tire snow tire some snowtires --Mark -- http://mail.python.org/mailman/listinfo/python-list