@@ -404,15 +404,16 @@ def _escape(source, escape, state):
404
404
pass
405
405
raise source .error ("bad escape %s" % escape , len (escape ))
406
406
407
- def _parse_sub (source , state , verbose , nested = True ):
407
+ def _parse_sub (source , state , verbose , nested ):
408
408
# parse an alternation: a|b|c
409
409
410
410
items = []
411
411
itemsappend = items .append
412
412
sourcematch = source .match
413
413
start = source .tell ()
414
414
while True :
415
- itemsappend (_parse (source , state , verbose , not nested and not items ))
415
+ itemsappend (_parse (source , state , verbose , nested + 1 ,
416
+ not nested and not items ))
416
417
if not sourcematch ("|" ):
417
418
break
418
419
@@ -454,10 +455,10 @@ def _parse_sub(source, state, verbose, nested=True):
454
455
subpattern .append ((BRANCH , (None , items )))
455
456
return subpattern
456
457
457
- def _parse_sub_cond (source , state , condgroup , verbose ):
458
- item_yes = _parse (source , state , verbose )
458
+ def _parse_sub_cond (source , state , condgroup , verbose , nested ):
459
+ item_yes = _parse (source , state , verbose , nested + 1 )
459
460
if source .match ("|" ):
460
- item_no = _parse (source , state , verbose )
461
+ item_no = _parse (source , state , verbose , nested + 1 )
461
462
if source .next == "|" :
462
463
raise source .error ("conditional backref with more than two branches" )
463
464
else :
@@ -466,7 +467,7 @@ def _parse_sub_cond(source, state, condgroup, verbose):
466
467
subpattern .append ((GROUPREF_EXISTS , (condgroup , item_yes , item_no )))
467
468
return subpattern
468
469
469
- def _parse (source , state , verbose , first = False ):
470
+ def _parse (source , state , verbose , nested , first = False ):
470
471
# parse a simple pattern
471
472
subpattern = SubPattern (state )
472
473
@@ -692,7 +693,7 @@ def _parse(source, state, verbose, first=False):
692
693
lookbehindgroups = state .lookbehindgroups
693
694
if lookbehindgroups is None :
694
695
state .lookbehindgroups = state .groups
695
- p = _parse_sub (source , state , verbose )
696
+ p = _parse_sub (source , state , verbose , nested + 1 )
696
697
if dir < 0 :
697
698
if lookbehindgroups is None :
698
699
state .lookbehindgroups = None
@@ -739,7 +740,7 @@ def _parse(source, state, verbose, first=False):
739
740
source .string [:20 ], # truncate long regexes
740
741
' (truncated)' if len (source .string ) > 20 else '' ,
741
742
),
742
- DeprecationWarning , stacklevel = 7
743
+ DeprecationWarning , stacklevel = nested + 6
743
744
)
744
745
if (state .flags & SRE_FLAG_VERBOSE ) and not verbose :
745
746
raise Verbose
@@ -757,11 +758,11 @@ def _parse(source, state, verbose, first=False):
757
758
except error as err :
758
759
raise source .error (err .msg , len (name ) + 1 ) from None
759
760
if condgroup :
760
- p = _parse_sub_cond (source , state , condgroup , verbose )
761
+ p = _parse_sub_cond (source , state , condgroup , verbose , nested + 1 )
761
762
else :
762
763
sub_verbose = ((verbose or (add_flags & SRE_FLAG_VERBOSE )) and
763
764
not (del_flags & SRE_FLAG_VERBOSE ))
764
- p = _parse_sub (source , state , sub_verbose )
765
+ p = _parse_sub (source , state , sub_verbose , nested + 1 )
765
766
if not source .match (")" ):
766
767
raise source .error ("missing ), unterminated subpattern" ,
767
768
source .tell () - start )
@@ -851,15 +852,15 @@ def parse(str, flags=0, pattern=None):
851
852
pattern .str = str
852
853
853
854
try :
854
- p = _parse_sub (source , pattern , flags & SRE_FLAG_VERBOSE , False )
855
+ p = _parse_sub (source , pattern , flags & SRE_FLAG_VERBOSE , 0 )
855
856
except Verbose :
856
857
# the VERBOSE flag was switched on inside the pattern. to be
857
858
# on the safe side, we'll parse the whole thing again...
858
859
pattern = Pattern ()
859
860
pattern .flags = flags | SRE_FLAG_VERBOSE
860
861
pattern .str = str
861
862
source .seek (0 )
862
- p = _parse_sub (source , pattern , True , False )
863
+ p = _parse_sub (source , pattern , True , 0 )
863
864
864
865
p .pattern .flags = fix_flags (str , p .pattern .flags )
865
866
0 commit comments