6767_ignorecase_fixes = {i :tuple (j for j in t if i != j )
6868for t in _equivalences for i in t }
6969
70+ class _CompileData :
71+ __slots__ = ('code' ,'repeat_count' )
72+ def __init__ (self ):
73+ self .code = []
74+ self .repeat_count = 0
75+
7076def _combine_flags (flags ,add_flags ,del_flags ,
7177TYPE_FLAGS = _parser .TYPE_FLAGS ):
7278if add_flags & TYPE_FLAGS :
7379flags &= ~ TYPE_FLAGS
7480return (flags | add_flags )& ~ del_flags
7581
76- def _compile (code ,pattern ,flags ):
82+ def _compile (data ,pattern ,flags ):
7783# internal: compile a (sub)pattern
84+ code = data .code
7885emit = code .append
7986_len = len
8087LITERAL_CODES = _LITERAL_CODES
@@ -147,15 +154,19 @@ def _compile(code, pattern, flags):
147154skip = _len (code );emit (0 )
148155emit (av [0 ])
149156emit (av [1 ])
150- _compile (code ,av [2 ],flags )
157+ _compile (data ,av [2 ],flags )
151158emit (SUCCESS )
152159code [skip ]= _len (code )- skip
153160else :
154161emit (REPEATING_CODES [op ][0 ])
155162skip = _len (code );emit (0 )
156163emit (av [0 ])
157164emit (av [1 ])
158- _compile (code ,av [2 ],flags )
165+ # now op is in (MIN_REPEAT, MAX_REPEAT, POSSESSIVE_REPEAT)
166+ if op != POSSESSIVE_REPEAT :
167+ emit (data .repeat_count )
168+ data .repeat_count += 1
169+ _compile (data ,av [2 ],flags )
159170code [skip ]= _len (code )- skip
160171emit (REPEATING_CODES [op ][1 ])
161172elif op is SUBPATTERN :
@@ -164,7 +175,7 @@ def _compile(code, pattern, flags):
164175emit (MARK )
165176emit ((group - 1 )* 2 )
166177# _compile_info(code, p, _combine_flags(flags, add_flags, del_flags))
167- _compile (code ,p ,_combine_flags (flags ,add_flags ,del_flags ))
178+ _compile (data ,p ,_combine_flags (flags ,add_flags ,del_flags ))
168179if group :
169180emit (MARK )
170181emit ((group - 1 )* 2 + 1 )
@@ -176,7 +187,7 @@ def _compile(code, pattern, flags):
176187# pop their stack if they reach it
177188emit (ATOMIC_GROUP )
178189skip = _len (code );emit (0 )
179- _compile (code ,av ,flags )
190+ _compile (data ,av ,flags )
180191emit (SUCCESS )
181192code [skip ]= _len (code )- skip
182193elif op in SUCCESS_CODES :
@@ -191,13 +202,13 @@ def _compile(code, pattern, flags):
191202if lo != hi :
192203raise error ("look-behind requires fixed-width pattern" )
193204emit (lo )# look behind
194- _compile (code ,av [1 ],flags )
205+ _compile (data ,av [1 ],flags )
195206emit (SUCCESS )
196207code [skip ]= _len (code )- skip
197208elif op is CALL :
198209emit (op )
199210skip = _len (code );emit (0 )
200- _compile (code ,av ,flags )
211+ _compile (data ,av ,flags )
201212emit (SUCCESS )
202213code [skip ]= _len (code )- skip
203214elif op is AT :
@@ -216,7 +227,7 @@ def _compile(code, pattern, flags):
216227for av in av [1 ]:
217228skip = _len (code );emit (0 )
218229# _compile_info(code, av, flags)
219- _compile (code ,av ,flags )
230+ _compile (data ,av ,flags )
220231emit (JUMP )
221232tailappend (_len (code ));emit (0 )
222233code [skip ]= _len (code )- skip
@@ -244,12 +255,12 @@ def _compile(code, pattern, flags):
244255emit (op )
245256emit (av [0 ]- 1 )
246257skipyes = _len (code );emit (0 )
247- _compile (code ,av [1 ],flags )
258+ _compile (data ,av [1 ],flags )
248259if av [2 ]:
249260emit (JUMP )
250261skipno = _len (code );emit (0 )
251262code [skipyes ]= _len (code )- skipyes + 1
252- _compile (code ,av [2 ],flags )
263+ _compile (data ,av [2 ],flags )
253264code [skipno ]= _len (code )- skipno
254265else :
255266code [skipyes ]= _len (code )- skipyes + 1
@@ -608,17 +619,17 @@ def isstring(obj):
608619def _code (p ,flags ):
609620
610621flags = p .state .flags | flags
611- code = []
622+ data = _CompileData ()
612623
613624# compile info block
614- _compile_info (code ,p ,flags )
625+ _compile_info (data . code ,p ,flags )
615626
616627# compile the pattern
617- _compile (code ,p .data ,flags )
628+ _compile (data ,p .data ,flags )
618629
619- code .append (SUCCESS )
630+ data . code .append (SUCCESS )
620631
621- return code
632+ return data
622633
623634def _hex_code (code ):
624635return '[%s]' % ', ' .join ('%#0*x' % (_sre .CODESIZE * 2 + 2 ,x )for x in code )
@@ -719,14 +730,21 @@ def print_2(*args):
719730else :
720731print_ (FAILURE )
721732i += 1
722- elif op in (REPEAT , REPEAT_ONE ,MIN_REPEAT_ONE ,
733+ elif op in (REPEAT_ONE ,MIN_REPEAT_ONE ,
723734POSSESSIVE_REPEAT ,POSSESSIVE_REPEAT_ONE ):
724735skip ,min ,max = code [i :i + 3 ]
725736if max == MAXREPEAT :
726737max = 'MAXREPEAT'
727738print_ (op ,skip ,min ,max ,to = i + skip )
728739dis_ (i + 3 ,i + skip )
729740i += skip
741+ elif op is REPEAT :
742+ skip ,min ,max ,repeat_index = code [i :i + 4 ]
743+ if max == MAXREPEAT :
744+ max = 'MAXREPEAT'
745+ print_ (op ,skip ,min ,max ,repeat_index ,to = i + skip )
746+ dis_ (i + 4 ,i + skip )
747+ i += skip
730748elif op is GROUPREF_EXISTS :
731749arg ,skip = code [i :i + 2 ]
732750print_ (op ,arg ,skip ,to = i + skip )
@@ -781,11 +799,11 @@ def compile(p, flags=0):
781799else :
782800pattern = None
783801
784- code = _code (p ,flags )
802+ data = _code (p ,flags )
785803
786804if flags & SRE_FLAG_DEBUG :
787805print ()
788- dis (code )
806+ dis (data . code )
789807
790808# map in either direction
791809groupindex = p .state .groupdict
@@ -794,7 +812,6 @@ def compile(p, flags=0):
794812indexgroup [i ]= k
795813
796814return _sre .compile (
797- pattern ,flags | p .state .flags ,code ,
798- p .state .groups - 1 ,
799- groupindex ,tuple (indexgroup )
800- )
815+ pattern ,flags | p .state .flags ,data .code ,
816+ p .state .groups - 1 ,groupindex ,tuple (indexgroup ),
817+ data .repeat_count )