diff -r c2f3b7c56dff Lib/sre_parse.py --- a/Lib/sre_parse.py Sat Oct 15 15:41:05 2016 +0900 +++ b/Lib/sre_parse.py Sun Oct 16 11:04:39 2016 +0200 @@ -884,6 +884,8 @@ literal = [] lappend = literal.append def addgroup(index): + if index > pattern.groups: + raise error("invalid group reference %r" % index) if literal: literals.append(''.join(literal)) del literal[:] diff -r c2f3b7c56dff Lib/test/test_re.py --- a/Lib/test/test_re.py Sat Oct 15 15:41:05 2016 +0900 +++ b/Lib/test/test_re.py Sun Oct 16 11:04:39 2016 +0200 @@ -186,18 +186,18 @@ r'octal escape value \777 outside of ' r'range 0-0o377', 0) - self.checkTemplateError('x', r'\1', 'x', 'invalid group reference') - self.checkTemplateError('x', r'\8', 'x', 'invalid group reference') - self.checkTemplateError('x', r'\9', 'x', 'invalid group reference') - self.checkTemplateError('x', r'\11', 'x', 'invalid group reference') - self.checkTemplateError('x', r'\18', 'x', 'invalid group reference') - self.checkTemplateError('x', r'\1a', 'x', 'invalid group reference') - self.checkTemplateError('x', r'\90', 'x', 'invalid group reference') - self.checkTemplateError('x', r'\99', 'x', 'invalid group reference') - self.checkTemplateError('x', r'\118', 'x', 'invalid group reference') # r'\11' + '8' - self.checkTemplateError('x', r'\11a', 'x', 'invalid group reference') - self.checkTemplateError('x', r'\181', 'x', 'invalid group reference') # r'\18' + '1' - self.checkTemplateError('x', r'\800', 'x', 'invalid group reference') # r'\80' + '0' + self.checkTemplateError('x', r'\1', 'x', 'invalid group reference 1') + self.checkTemplateError('x', r'\8', 'x', 'invalid group reference 8') + self.checkTemplateError('x', r'\9', 'x', 'invalid group reference 9') + self.checkTemplateError('x', r'\11', 'x', 'invalid group reference 11') + self.checkTemplateError('x', r'\18', 'x', 'invalid group reference 18') + self.checkTemplateError('x', r'\1a', 'x', 'invalid group reference 1') + self.checkTemplateError('x', r'\90', 'x', 'invalid group reference 90') + self.checkTemplateError('x', r'\99', 'x', 'invalid group reference 99') + self.checkTemplateError('x', r'\118', 'x', 'invalid group reference 11') # r'\11' + '8' + self.checkTemplateError('x', r'\11a', 'x', 'invalid group reference 11') + self.checkTemplateError('x', r'\181', 'x', 'invalid group reference 18') # r'\18' + '1' + self.checkTemplateError('x', r'\800', 'x', 'invalid group reference 80') # r'\80' + '0' # in python2.3 (etc), these loop endlessly in sre_parser.py self.assertEqual(re.sub('(((((((((((x)))))))))))', r'\11', 'x'), 'x') @@ -271,9 +271,9 @@ self.checkTemplateError('(?Px)', r'\g<1a1>', 'xx', "bad character in group name '1a1'", 3) self.checkTemplateError('(?Px)', r'\g<2>', 'xx', - 'invalid group reference') + 'invalid group reference 2') self.checkTemplateError('(?Px)', r'\2', 'xx', - 'invalid group reference') + 'invalid group reference 2') with self.assertRaisesRegex(IndexError, "unknown group name 'ab'"): re.sub('(?Px)', r'\g', 'xx') self.assertEqual(re.sub('(?Px)|(?Py)', r'\g', 'xx'), '')