]> granicus.if.org Git - python/commitdiff
Issues #814253, #9179: Group references and conditional group references now
authorSerhiy Storchaka <storchaka@gmail.com>
Fri, 7 Nov 2014 19:45:17 +0000 (21:45 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Fri, 7 Nov 2014 19:45:17 +0000 (21:45 +0200)
work in lookbehind assertions in regular expressions.

1  2 
Lib/re.py
Lib/sre_parse.py
Lib/test/test_re.py
Misc/NEWS

diff --cc Lib/re.py
Simple merge
index 68efece3062767bb68bfc864bfddf4a643cbc552,fad80148aa27fefe7c6ee5ffc5c58594dc020902..edc3ff143ac464361e594c46946cea84d1b4e724
@@@ -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")
Simple merge
diff --cc Misc/NEWS
Simple merge