]> granicus.if.org Git - python/commitdiff
Jeffrey's latest.
authorGuido van Rossum <guido@python.org>
Fri, 11 Jul 1997 20:48:25 +0000 (20:48 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 11 Jul 1997 20:48:25 +0000 (20:48 +0000)
Lib/re.py
Lib/test/output/test_re

index 2a179afc1b613a1eab03296760dcc1af1a56b038..e2732b84607e41efefccc35b54cc092e0d534e40 100644 (file)
--- a/Lib/re.py
+++ b/Lib/re.py
@@ -51,13 +51,13 @@ def search(pattern, string, flags=0):
     return compile(pattern, flags).search(string)
 
 def sub(pattern, repl, string, count=0):
-    pass
+    return compile(pattern).sub(repl, string, count)
 
 def subn(pattern, repl, string, count=0):
-    pass
+    return compile(pattern).subn(repl, string, count)
 
-def split(string, pattern, maxsplit=0):
-    pass
+def split(pattern, string, maxsplit=0):
+    return compile(pattern).subn(string, maxsplit)
 
 #
 #
@@ -79,21 +79,6 @@ class RegexObject:
        else:
            self.anchor = 0
        self.buffer = assemble(code)
-    def match(self, string, pos=0):
-       regs = reop.match(self.buffer,
-                         self.num_regs,
-                         self.flags,
-                         self.fastmap.can_be_null,
-                         self.fastmap.fastmap(),
-                         self.anchor,
-                         string,
-                         pos)
-       if regs is None:
-           return None
-       return MatchObject(self,
-                          string,
-                          pos,
-                          regs)
     def search(self, string, pos=0):
        regs = reop.search(self.buffer,
                           self.num_regs,
@@ -109,6 +94,27 @@ class RegexObject:
                           string,
                           pos,
                           regs)
+    def match(self, string, pos=0):
+       regs = reop.match(self.buffer,
+                         self.num_regs,
+                         self.flags,
+                         self.fastmap.can_be_null,
+                         self.fastmap.fastmap(),
+                         self.anchor,
+                         string,
+                         pos)
+       if regs is None:
+           return None
+       return MatchObject(self,
+                          string,
+                          pos,
+                          regs)
+    def sub(self, repl, string, count=0):
+       pass
+    def subn(self, repl, string, count=0):
+       pass
+    def split(self, string, maxsplit=0):
+       pass
     
 class MatchObject:
     def __init__(self, re, string, pos, regs):
@@ -116,34 +122,49 @@ class MatchObject:
        self.string = string
        self.pos = pos
        self.regs = regs
-    def start(self, i):
-       if type(i) == type(''):
+    def start(self, g):
+       if type(g) == type(''):
            try:
-               i = self.re.groupindex[i]
+               g = self.re.groupindex[g]
            except (KeyError, TypeError):
-               raise IndexError
-       return self.regs[i][0]
-    def end(self, i):
-       if type(i) == type(''):
+               raise IndexError, ('group "' + g + '" is undefined')
+       return self.regs[g][0]
+    def end(self, g):
+       if type(g) == type(''):
            try:
-               i = self.re.groupindex[i]
+               g = self.re.groupindex[g]
            except (KeyError, TypeError):
-               raise IndexError
-       return self.regs[i][1]
-    def span(self, i):
-       if type(i) == type(''):
+               raise IndexError, ('group "' + g + '" is undefined')
+       return self.regs[g][1]
+    def span(self, g):
+       if type(g) == type(''):
            try:
-               i = self.re.groupindex[i]
+               g = self.re.groupindex[g]
            except (KeyError, TypeError):
-               raise IndexError
-       return self.regs[i]
-    def group(self, i):
-       if type(i) == type(''):
-           try:
-               i = self.re.groupindex[i]
-           except (KeyError, TypeError):
-               raise IndexError
-       return self.string[self.regs[i][0]:self.regs[i][1]]
+               raise IndexError, ('group "' + g + '" is undefined')
+       return self.regs[g]
+    def group(self, *groups):
+       if len(groups) == 0:
+           groups = range(1, self.re.num_regs)
+       result = []
+       for g in groups:
+           if type(g) == type(''):
+               try:
+                   g = self.re.groupindex[g]
+               except (KeyError, TypeError):
+                   raise IndexError, ('group "' + g + '" is undefined')
+           if g >= len(self.regs):
+               result.append(None)
+           elif (self.regs[g][0] == -1) or (self.regs[g][1] == -1):
+               result.append(None)
+           else:
+               result.append(self.string[self.regs[g][0]:self.regs[g][1]])
+       if len(result) > 1:
+           return tuple(result)
+       elif len(result) == 1:
+           return result[0]
+       else:
+           return ()
 
 #
 # A set of classes to make assembly a bit easier, if a bit verbose.
@@ -331,7 +352,7 @@ class SyntaxSpec(Instruction):
     def assemble(self, postition, labels):
        return self.opcode + chr(self.syntax)
 
-class SyntaxSpec(Instruction):
+class NotSyntaxSpec(Instruction):
     name = 'notsyntaxspec'
     def __init__(self, syntax):
        self.syntax = syntax
@@ -382,13 +403,12 @@ def assemble(instructions):
 #
 
 def escape(pattern):
-    result = ''
+    result = []
     for char in pattern:
        if 'word' not in syntax_table[char]:
-           result = result + '\\' + char
-       else:
-           result = result + char
-    return result
+           result.append('\\')
+       result.append(char)
+    return string.join(result, '')
 
 #
 #
@@ -631,7 +651,7 @@ def compile(pattern, flags=0):
                         expr + \
                         [Jump(-1),
                          Label(label)])
-           stack.append([('|',)])
+           stack.append([Alternation()])
            label = label + 1
 
        elif char == '(':
@@ -693,12 +713,13 @@ def compile(pattern, flags=0):
                        stack.append([FunctionCallout(name)])
 
                    else:
-                       raise error, 'unknown Python extension'
+                       raise error, ('unknown Python extension: ' + \
+                                     pattern[index])
                    
                elif pattern[index] == ':':
                    # grouping, but no registers
                    index = index + 1
-                   stack.append([('(', -1)])
+                   stack.append([OpenParen(-1)])
 
                elif pattern[index] == '#':
                    # comment
index b87400f0db40cab5be2334b1ba28919b0e390c65..b1907ccf548805b19b682c43054d4ee7e81b7037 100644 (file)
@@ -40,7 +40,7 @@ test_re
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 1078, in compile
+  File "../Lib/re.py", line 1099, in compile
     if pattern[index] != ']':
 IndexError: string index out of range
 ('a[', '-', 2)
@@ -65,21 +65,7 @@ IndexError: string index out of range
 ('\\by\\b', 'yz', 1)
 ('\\by\\b', 'xyz', 1)
 ('ab|cd', 'abc', 0, 'found', 'ab')
-*** Unexpected error ***
-Traceback (innermost last):
-  File "../Lib/test/test_re.py", line 19, in ?
-    obj=re.compile(pattern)
-  File "../Lib/re.py", line 1097, in compile
-    if stack[-1][0].name == '(':
-AttributeError: attribute-less object
 ('ab|cd', 'abcd', 0, 'found', 'ab')
-*** Unexpected error ***
-Traceback (innermost last):
-  File "../Lib/test/test_re.py", line 19, in ?
-    obj=re.compile(pattern)
-  File "../Lib/re.py", line 1097, in compile
-    if stack[-1][0].name == '(':
-AttributeError: attribute-less object
 ('()ef', 'def', 0, 'found+"-"+g1', 'ef-')
 === Syntax error: ('()ef', 'def', 0, 'found+"-"+g1', 'ef-')
 ('$b', 'b', 1)
@@ -91,54 +77,47 @@ AttributeError: attribute-less object
 ('a\\\\b', 'a\\b', 0, 'found', 'a\\b')
 === Failed incorrectly ('a\\\\b', 'a\\b', 0, 'found', 'a\\b')
 ('((a))', 'abc', 0, 'found+"-"+g1+"-"+g2', 'a-a-a')
-=== grouping error ('((a))', 'abc', 0, 'found+"-"+g1+"-"+g2', 'a-a-a') 'a--' should be 'a-a-a'
+=== grouping error ('((a))', 'abc', 0, 'found+"-"+g1+"-"+g2', 'a-a-a') 'a-None-None' should be 'a-a-a'
 ('(a)b(c)', 'abc', 0, 'found+"-"+g1+"-"+g2', 'abc-a-c')
-=== grouping error ('(a)b(c)', 'abc', 0, 'found+"-"+g1+"-"+g2', 'abc-a-c') 'abc--' should be 'abc-a-c'
+=== grouping error ('(a)b(c)', 'abc', 0, 'found+"-"+g1+"-"+g2', 'abc-a-c') 'abc-None-None' should be 'abc-a-c'
 ('a+b+c', 'aabbabc', 0, 'found', 'abc')
 ('(a+|b)*', 'ab', 0, 'found+"-"+g1', 'ab-b')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(a+|b)+', 'ab', 0, 'found+"-"+g1', 'ab-b')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(a+|b)?', 'ab', 0, 'found+"-"+g1', 'a-a')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 (')(', '-', 2)
 ('[^ab]*', 'cde', 0, 'found', 'cde')
 ('abc', '', 1)
 ('a*', '', 0, 'found', '')
 ('a|b|c|d|e', 'e', 0, 'found', 'e')
-*** Unexpected error ***
-Traceback (innermost last):
-  File "../Lib/test/test_re.py", line 19, in ?
-    obj=re.compile(pattern)
-  File "../Lib/re.py", line 625, in compile
-    while (len(stack) != 0) and \
-AttributeError: attribute-less object
 ('(a|b|c|d|e)f', 'ef', 0, 'found+"-"+g1', 'ef-e')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 625, in compile
-    while (len(stack) != 0) and \
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('abcd*efg', 'abcdefg', 0, 'found', 'abcdefg')
 ('ab*', 'xabyabbbz', 0, 'found', 'ab')
 ('ab*', 'xayabbbz', 0, 'found', 'a')
@@ -147,50 +126,44 @@ AttributeError: attribute-less object
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('[abhgefdc]ij', 'hij', 0, 'found', 'hij')
 ('^(ab|cd)e', 'abcde', 1, 'xg1y', 'xy')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(abc|)ef', 'abcdef', 0, 'found+"-"+g1', 'ef-')
-*** Unexpected error ***
-Traceback (innermost last):
-  File "../Lib/test/test_re.py", line 19, in ?
-    obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+=== Syntax error: ('(abc|)ef', 'abcdef', 0, 'found+"-"+g1', 'ef-')
 ('(a|b)c*d', 'abcd', 0, 'found+"-"+g1', 'bcd-b')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(ab|ab*)bc', 'abc', 0, 'found+"-"+g1', 'abc-a')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('a([bc]*)c*', 'abc', 0, 'found+"-"+g1', 'abc-bc')
-=== grouping error ('a([bc]*)c*', 'abc', 0, 'found+"-"+g1', 'abc-bc') 'abc-' should be 'abc-bc'
+=== grouping error ('a([bc]*)c*', 'abc', 0, 'found+"-"+g1', 'abc-bc') 'abc-None' should be 'abc-bc'
 ('a([bc]*)(c*d)', 'abcd', 0, 'found+"-"+g1+"-"+g2', 'abcd-bc-d')
-=== grouping error ('a([bc]*)(c*d)', 'abcd', 0, 'found+"-"+g1+"-"+g2', 'abcd-bc-d') 'abcd--' should be 'abcd-bc-d'
+=== grouping error ('a([bc]*)(c*d)', 'abcd', 0, 'found+"-"+g1+"-"+g2', 'abcd-bc-d') 'abcd-None-None' should be 'abcd-bc-d'
 ('a([bc]+)(c*d)', 'abcd', 0, 'found+"-"+g1+"-"+g2', 'abcd-bc-d')
-=== grouping error ('a([bc]+)(c*d)', 'abcd', 0, 'found+"-"+g1+"-"+g2', 'abcd-bc-d') 'abcd--' should be 'abcd-bc-d'
+=== grouping error ('a([bc]+)(c*d)', 'abcd', 0, 'found+"-"+g1+"-"+g2', 'abcd-bc-d') 'abcd-None-None' should be 'abcd-bc-d'
 ('a([bc]*)(c+d)', 'abcd', 0, 'found+"-"+g1+"-"+g2', 'abcd-b-cd')
-=== grouping error ('a([bc]*)(c+d)', 'abcd', 0, 'found+"-"+g1+"-"+g2', 'abcd-b-cd') 'abcd--' should be 'abcd-b-cd'
+=== grouping error ('a([bc]*)(c+d)', 'abcd', 0, 'found+"-"+g1+"-"+g2', 'abcd-b-cd') 'abcd-None-None' should be 'abcd-b-cd'
 ('a[bcd]*dcdcde', 'adcdcde', 0, 'found', 'adcdcde')
 ('a[bcd]+dcdcde', 'adcdcde', 1)
 ('(ab|a)b*c', 'abc', 0, 'found+"-"+g1', 'abc-ab')
@@ -198,142 +171,129 @@ AttributeError: attribute-less object
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('((a)(b)c)(d)', 'abcd', 0, 'g1+"-"+g2+"-"+g3+"-"+g4', 'abc-a-b-d')
-=== grouping error ('((a)(b)c)(d)', 'abcd', 0, 'g1+"-"+g2+"-"+g3+"-"+g4', 'abc-a-b-d') '---' should be 'abc-a-b-d'
+=== grouping error ('((a)(b)c)(d)', 'abcd', 0, 'g1+"-"+g2+"-"+g3+"-"+g4', 'abc-a-b-d') 'None-None-None-None' should be 'abc-a-b-d'
 ('[a-zA-Z_][a-zA-Z0-9_]*', 'alpha', 0, 'found', 'alpha')
 ('^a(bc+|b[eh])g|.h$', 'abh', 0, 'found+"-"+g1', 'bh-None')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(bc+d$|ef*g.|h?i(j|k))', 'effgz', 0, 'found+"-"+g1+"-"+g2', 'effgz-effgz-None')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 625, in compile
-    while (len(stack) != 0) and \
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(bc+d$|ef*g.|h?i(j|k))', 'ij', 0, 'found+"-"+g1+"-"+g2', 'ij-ij-j')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 625, in compile
-    while (len(stack) != 0) and \
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(bc+d$|ef*g.|h?i(j|k))', 'effg', 1)
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 625, in compile
-    while (len(stack) != 0) and \
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(bc+d$|ef*g.|h?i(j|k))', 'bcdd', 1)
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 625, in compile
-    while (len(stack) != 0) and \
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(bc+d$|ef*g.|h?i(j|k))', 'reffgz', 0, 'found+"-"+g1+"-"+g2', 'effgz-effgz-None')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 625, in compile
-    while (len(stack) != 0) and \
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(((((((((a)))))))))', 'a', 0, 'found', 'a')
 ('multiple words of text', 'uh-uh', 1)
 ('multiple words', 'multiple words, yeah', 0, 'found', 'multiple words')
 === Failed incorrectly ('multiple words', 'multiple words, yeah', 0, 'found', 'multiple words')
 ('(.*)c(.*)', 'abcde', 0, 'found+"-"+g1+"-"+g2', 'abcde-ab-de')
-=== grouping error ('(.*)c(.*)', 'abcde', 0, 'found+"-"+g1+"-"+g2', 'abcde-ab-de') 'abcde--' should be 'abcde-ab-de'
+=== grouping error ('(.*)c(.*)', 'abcde', 0, 'found+"-"+g1+"-"+g2', 'abcde-ab-de') 'abcde-None-None' should be 'abcde-ab-de'
 ('((.*), (.*))', '(a, b)', 0, 'g2+"-"+g1', 'b-a')
-=== grouping error ('((.*), (.*))', '(a, b)', 0, 'g2+"-"+g1', 'b-a') '-' should be 'b-a'
+=== grouping error ('((.*), (.*))', '(a, b)', 0, 'g2+"-"+g1', 'b-a') 'None-None' should be 'b-a'
 ('[k]', 'ab', 1)
 ('a[-]?c', 'ac', 0, 'found', 'ac')
 ('(abc)\\1', 'abcabc', 0, 'g1', 'abc')
-=== grouping error ('(abc)\\1', 'abcabc', 0, 'g1', 'abc') '' should be 'abc'
+=== grouping error ('(abc)\\1', 'abcabc', 0, 'g1', 'abc') 'None' should be 'abc'
 ('([a-c]*)\\1', 'abcabc', 0, 'g1', 'abc')
-=== grouping error ('([a-c]*)\\1', 'abcabc', 0, 'g1', 'abc') '' should be 'abc'
+=== grouping error ('([a-c]*)\\1', 'abcabc', 0, 'g1', 'abc') 'None' should be 'abc'
 ('^(.+)?B', 'AB', 0, 'g1', 'A')
-=== grouping error ('^(.+)?B', 'AB', 0, 'g1', 'A') '' should be 'A'
+=== grouping error ('^(.+)?B', 'AB', 0, 'g1', 'A') 'None' should be 'A'
 ('(a+).\\1$', 'aaaaa', 0, 'found+"-"+g1', 'aaaaa-aa')
-=== grouping error ('(a+).\\1$', 'aaaaa', 0, 'found+"-"+g1', 'aaaaa-aa') 'aaaaa-' should be 'aaaaa-aa'
+=== grouping error ('(a+).\\1$', 'aaaaa', 0, 'found+"-"+g1', 'aaaaa-aa') 'aaaaa-None' should be 'aaaaa-aa'
 ('^(a+).\\1$', 'aaaa', 1)
 ('(abc)\\1', 'abcabc', 0, 'found+"-"+g1', 'abcabc-abc')
-=== grouping error ('(abc)\\1', 'abcabc', 0, 'found+"-"+g1', 'abcabc-abc') 'abcabc-' should be 'abcabc-abc'
+=== grouping error ('(abc)\\1', 'abcabc', 0, 'found+"-"+g1', 'abcabc-abc') 'abcabc-None' should be 'abcabc-abc'
 ('([a-c]+)\\1', 'abcabc', 0, 'found+"-"+g1', 'abcabc-abc')
-=== grouping error ('([a-c]+)\\1', 'abcabc', 0, 'found+"-"+g1', 'abcabc-abc') 'abcabc-' should be 'abcabc-abc'
+=== grouping error ('([a-c]+)\\1', 'abcabc', 0, 'found+"-"+g1', 'abcabc-abc') 'abcabc-None' should be 'abcabc-abc'
 ('(a)\\1', 'aa', 0, 'found+"-"+g1', 'aa-a')
-=== grouping error ('(a)\\1', 'aa', 0, 'found+"-"+g1', 'aa-a') 'aa-' should be 'aa-a'
+=== grouping error ('(a)\\1', 'aa', 0, 'found+"-"+g1', 'aa-a') 'aa-None' should be 'aa-a'
 ('(a+)\\1', 'aa', 0, 'found+"-"+g1', 'aa-a')
-=== grouping error ('(a+)\\1', 'aa', 0, 'found+"-"+g1', 'aa-a') 'aa-' should be 'aa-a'
+=== grouping error ('(a+)\\1', 'aa', 0, 'found+"-"+g1', 'aa-a') 'aa-None' should be 'aa-a'
 ('(a+)+\\1', 'aa', 0, 'found+"-"+g1', 'aa-a')
-=== grouping error ('(a+)+\\1', 'aa', 0, 'found+"-"+g1', 'aa-a') 'aa-' should be 'aa-a'
+=== grouping error ('(a+)+\\1', 'aa', 0, 'found+"-"+g1', 'aa-a') 'aa-None' should be 'aa-a'
 ('(a).+\\1', 'aba', 0, 'found+"-"+g1', 'aba-a')
-=== grouping error ('(a).+\\1', 'aba', 0, 'found+"-"+g1', 'aba-a') 'aba-' should be 'aba-a'
+=== grouping error ('(a).+\\1', 'aba', 0, 'found+"-"+g1', 'aba-a') 'aba-None' should be 'aba-a'
 ('(a)ba*\\1', 'aba', 0, 'found+"-"+g1', 'aba-a')
-=== grouping error ('(a)ba*\\1', 'aba', 0, 'found+"-"+g1', 'aba-a') 'aba-' should be 'aba-a'
+=== grouping error ('(a)ba*\\1', 'aba', 0, 'found+"-"+g1', 'aba-a') 'aba-None' should be 'aba-a'
 ('(aa|a)a\\1$', 'aaa', 0, 'found+"-"+g1', 'aaa-a')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(a|aa)a\\1$', 'aaa', 0, 'found+"-"+g1', 'aaa-a')
 *** Unexpected error ***
 Traceback (innermost last):
   File "../Lib/test/test_re.py", line 19, in ?
     obj=re.compile(pattern)
-  File "../Lib/re.py", line 745, in compile
-    while (len(stack) > 0) and (stack[-1][0].name != '('):
-AttributeError: attribute-less object
+  File "../Lib/re.py", line 786, in compile
+    expr[i] = JumpOpcode(label)
+NameError: JumpOpcode
 ('(a+)a\\1$', 'aaa', 0, 'found+"-"+g1', 'aaa-a')
-=== grouping error ('(a+)a\\1$', 'aaa', 0, 'found+"-"+g1', 'aaa-a') 'aaa-' should be 'aaa-a'
+=== grouping error ('(a+)a\\1$', 'aaa', 0, 'found+"-"+g1', 'aaa-a') 'aaa-None' should be 'aaa-a'
 ('([abc]*)\\1', 'abcabc', 0, 'found+"-"+g1', 'abcabc-abc')
-=== grouping error ('([abc]*)\\1', 'abcabc', 0, 'found+"-"+g1', 'abcabc-abc') 'abcabc-' should be 'abcabc-abc'
+=== grouping error ('([abc]*)\\1', 'abcabc', 0, 'found+"-"+g1', 'abcabc-abc') 'abcabc-None' should be 'abcabc-abc'
 ('(a)(b)c|ab', 'ab', 0, 'found+"-"+g1+"-"+g2', 'ab-None-None')
-*** Unexpected error ***
-Traceback (innermost last):
-  File "../Lib/test/test_re.py", line 19, in ?
-    obj=re.compile(pattern)
-  File "../Lib/re.py", line 1097, in compile
-    if stack[-1][0].name == '(':
-AttributeError: attribute-less object
 ('(a)+x', 'aaax', 0, 'found+"-"+g1', 'aaax-a')
-=== grouping error ('(a)+x', 'aaax', 0, 'found+"-"+g1', 'aaax-a') 'aaax-' should be 'aaax-a'
+=== grouping error ('(a)+x', 'aaax', 0, 'found+"-"+g1', 'aaax-a') 'aaax-None' should be 'aaax-a'
 ('([ac])+x', 'aacx', 0, 'found+"-"+g1', 'aacx-c')
-=== grouping error ('([ac])+x', 'aacx', 0, 'found+"-"+g1', 'aacx-c') 'aacx-' should be 'aacx-c'
+=== grouping error ('([ac])+x', 'aacx', 0, 'found+"-"+g1', 'aacx-c') 'aacx-None' should be 'aacx-c'
 ('([^/]*/)*sub1/', 'd:msgs/tdir/sub1/trial/away.cpp', 0, 'found+"-"+g1', 'd:msgs/tdir/sub1/-tdir/')
-=== grouping error ('([^/]*/)*sub1/', 'd:msgs/tdir/sub1/trial/away.cpp', 0, 'found+"-"+g1', 'd:msgs/tdir/sub1/-tdir/') 'd:msgs/tdir/sub1/-' should be 'd:msgs/tdir/sub1/-tdir/'
+=== grouping error ('([^/]*/)*sub1/', 'd:msgs/tdir/sub1/trial/away.cpp', 0, 'found+"-"+g1', 'd:msgs/tdir/sub1/-tdir/') 'd:msgs/tdir/sub1/-None' should be 'd:msgs/tdir/sub1/-tdir/'
 ('([^.]*)\\.([^:]*):[T ]+(.*)', 'track1.title:TBlah blah blah', 0, 'found+"-"+g1+"-"+g2+"-"+g3', 'track1.title:TBlah blah blah-track1-title-Blah blah blah')
 === Failed incorrectly ('([^.]*)\\.([^:]*):[T ]+(.*)', 'track1.title:TBlah blah blah', 0, 'found+"-"+g1+"-"+g2+"-"+g3', 'track1.title:TBlah blah blah-track1-title-Blah blah blah')
 ('([^N]*N)+', 'abNNxyzN', 0, 'found+"-"+g1', 'abNNxyzN-xyzN')
-=== grouping error ('([^N]*N)+', 'abNNxyzN', 0, 'found+"-"+g1', 'abNNxyzN-xyzN') 'abNNxyzN-' should be 'abNNxyzN-xyzN'
+=== grouping error ('([^N]*N)+', 'abNNxyzN', 0, 'found+"-"+g1', 'abNNxyzN-xyzN') 'abNNxyzN-None' should be 'abNNxyzN-xyzN'
 ('([^N]*N)+', 'abNNxyz', 0, 'found+"-"+g1', 'abNN-N')
-=== grouping error ('([^N]*N)+', 'abNNxyz', 0, 'found+"-"+g1', 'abNN-N') 'abNN-' should be 'abNN-N'
+=== grouping error ('([^N]*N)+', 'abNNxyz', 0, 'found+"-"+g1', 'abNN-N') 'abNN-None' should be 'abNN-N'
 ('([abc]*)x', 'abcx', 0, 'found+"-"+g1', 'abcx-abc')
-=== grouping error ('([abc]*)x', 'abcx', 0, 'found+"-"+g1', 'abcx-abc') 'abcx-' should be 'abcx-abc'
+=== grouping error ('([abc]*)x', 'abcx', 0, 'found+"-"+g1', 'abcx-abc') 'abcx-None' should be 'abcx-abc'
 ('([abc]*)x', 'abc', 1)
 ('([xyz]*)x', 'abcx', 0, 'found+"-"+g1', 'x-')
+=== grouping error ('([xyz]*)x', 'abcx', 0, 'found+"-"+g1', 'x-') 'x-None' should be 'x-'
 ('(a)+b|aac', 'aac', 0, 'found+"-"+g1', 'aac-None')
-*** Unexpected error ***
-Traceback (innermost last):
-  File "../Lib/test/test_re.py", line 19, in ?
-    obj=re.compile(pattern)
-  File "../Lib/re.py", line 1097, in compile
-    if stack[-1][0].name == '(':
-AttributeError: attribute-less object