>> "xyz123aaabbaaabab"
>> 
>> where you have "aaab" in there twice.
> 
> Good suggestion.

I assumed that this would be a valid case.  If not, the
expression would need tweaking.

>> ^([^b]|((?<!a)b))*aaab+[ab]*$
> 
> Looks good, although I've been unable to find a good
> explanation of the "negative lookbehind" construct "(?<".  How
> does it work?

The beginning part of the expression

        ([^b]|((?<!a)b))*

breaks down as

        [^b]        anything that isn't a "b"
        |           or
        (...)       this other thing

where "this other thing" is

        (?<!a)b     a "b" as long as it isn't immediately
                    preceeded by an "a"

The "(?<!...)" construct means that the "..." portion can't come 
before the following token in the regexp...in this case, before a 
"b".

There's also a "negative lookahead" (rather than "lookbehind") 
which prevents items from following.  This should be usable in 
this scenario as wall and works with the aforementioned tests, using

        "^([^a]|(a(?!b)))*aaab+[ab]*$"

which would be "anything that's not an 'a'; or an 'a' as long as 
it's not followed by a 'b'"

The gospel is at:
http://docs.python.org/lib/re-syntax.html

but is a bit terse.  O'reily has a fairly good book on regexps if 
you want to dig a bit deeper.

-tkc



-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to