[ python-Bugs-1177831 ] (?(id)yes|no) only works when referencing the first group

SourceForge.net noreply at sourceforge.net
Thu Jun 2 15:41:34 CEST 2005


Bugs item #1177831, was opened at 2005-04-06 11:06
Message generated for change (Comment added) made by akuchling
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1177831&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
>Category: Regular Expressions
Group: None
>Status: Closed
>Resolution: Fixed
Priority: 5
Submitted By: André Malo (ndparker)
>Assigned to: A.M. Kuchling (akuchling)
Summary: (?(id)yes|no) only works when referencing the first group

Initial Comment:
(?(id)yes|no) only works when referencing the first group

Referencing other marked groups may lead to weird results.

The problem is, that the compiler stores the following
code:

<op> <mark> <skip> ...

(op = GROUPREF_EXISTS)

while the matcher expects:

<op> <group> <skip> ...

where group is <number of paren -1> and <mark> is
<group * 2>.

This is the problematic code in sre_compile.py (1.57):

   168	        elif op is GROUPREF_EXISTS:
   169	            emit(OPCODES[op])
   170	            emit((av[0]-1)*2)
   171	            skipyes = _len(code); emit(0)
   172	            _compile(code, av[1], flags)

changing line 170 to

emit(av[0]-1)

fixes the bug.

----------------------------------------------------------------------

>Comment By: A.M. Kuchling (akuchling)
Date: 2005-06-02 09:41

Message:
Logged In: YES 
user_id=11375

Thank you for your excellent explanation and suggested fix.  I've applied 
the fix to both CVS HEAD and 2.4-maint, and added a test case that 
exercises groups greater than 1.


----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1177831&group_id=5470


More information about the Python-bugs-list mailing list