regex negative lookbehind assertion not working correctly?

andrew cooke andrew at acooke.org
Tue Mar 31 17:52:20 CEST 2009


it is working - it's making the final "8" not be matched.

don't you want lookahead rather than lookbehind?  or force an end of string?

andrew



Gabriel Rossetti wrote:
> Hello everyone,
>
> I am trying to write a regex pattern to match an ID in a URL only if it
> is not a given ID. Here's an example, the ID not to match is
> "14522XXX98", if my URL is "/profile.php?id=14522XXX99" I want it to
> match and if it's "/profile.php?id=14522XXX98" I want it not to. I tried
> this:
>
>  >>> re.search(r"/profile.php\?id=(\d+)(?<!14522XXX98)",
> "/profile.php?id=14522XXX98").groups()
> ('14522XXX9',)
>
> which should not match, but it does, then I tried this :
>
>  >>> re.search(r"/profile.php\?id=(\d+)(?<!14522XXX98)",
> "/profile.php?id=14522XXX99").groups()
> ('14522XXX99',)
>
> which should match and it does. I then tried uring /positive lookbehind
> assertion/ instead and it does this :
>
>  >>> re.search(r"/profile.php\?id=(\d+)(?<=14522XXX98)",
> "/profile.php?id=14522XXX98").groups()
> ('14522XXX98',)
>
> which matches as it should and then I tried this :
>
>  >>> re.search(r"/profile.php\?id=(\d+)(?<=14522XXX98)",
> "/profile.php?id=14522XXX99").groups()
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> AttributeError: 'NoneType' object has no attribute 'groups'
>
> which doesn't match as it should. Could someone please explain why the
> negative lookbehind assertion is not working as I understand it? Also,
> notice how the last digit of the first expression is not matched, I get
> ('14522XXX9',) instead of ('14522XXX98',), why? It does on the others....
>
> Thank you,
> Gabriel
> --
> http://mail.python.org/mailman/listinfo/python-list
>
>





More information about the Python-list mailing list