From: Serhiy Storchaka Date: Fri, 7 Nov 2014 19:45:17 +0000 (+0200) Subject: Issues #814253, #9179: Group references and conditional group references now X-Git-Tag: v3.5.0a1~504 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6276b32799d9396bb32dbbcbed61b3045ce166ec;p=python Issues #814253, #9179: Group references and conditional group references now work in lookbehind assertions in regular expressions. --- 6276b32799d9396bb32dbbcbed61b3045ce166ec diff --cc Lib/sre_parse.py index 68efece306,fad80148aa..edc3ff143a --- a/Lib/sre_parse.py +++ b/Lib/sre_parse.py @@@ -69,14 -66,14 +69,16 @@@ class Pattern # master pattern object. keeps track of global attributes def __init__(self): self.flags = 0 - self.open = [] - self.groups = 1 self.groupdict = {} + self.subpatterns = [None] # group 0 + @property + def groups(self): + return len(self.subpatterns) def opengroup(self, name=None): gid = self.groups - self.groups = gid + 1 + self.subpatterns.append(None) + if self.groups > MAXGROUPS: + raise error("groups number is too large") if name is not None: ogid = self.groupdict.get(name, None) if ogid is not None: @@@ -181,10 -179,24 +182,24 @@@ class SubPattern i, j = av[2].getwidth() lo = lo + i * av[0] hi = hi + j * av[1] - elif op in UNITCODES: + elif op in _UNITCODES: lo = lo + 1 hi = hi + 1 - elif op == SUCCESS: + elif op is GROUPREF: + i, j = self.pattern.subpatterns[av].getwidth() + lo = lo + i + hi = hi + j + elif op is GROUPREF_EXISTS: + i, j = av[1].getwidth() + if av[2] is not None: + l, h = av[2].getwidth() + i = min(i, l) + j = max(j, h) + else: + i = 0 + lo = lo + i + hi = hi + j + elif op is SUCCESS: break self.width = min(lo, MAXREPEAT - 1), min(hi, MAXREPEAT) return self.width @@@ -705,10 -724,10 +720,10 @@@ def _parse(source, state) if not sourcematch(")"): raise error("unbalanced parenthesis") if group is not None: - state.closegroup(group) + state.closegroup(group, p) subpatternappend((SUBPATTERN, (group, p))) else: - while 1: + while True: char = sourceget() if char is None: raise error("unexpected end of pattern")