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 Thu Oct 20 21:28:45 2016 +0200 @@ -725,7 +725,7 @@ raise source.error("bad group number", len(condname) + 1) if condgroup >= MAXGROUPS: - raise source.error("invalid group reference", + raise source.error("invalid group reference %r" % condgroup, len(condname) + 1) state.checklookbehindgroup(condgroup, source) elif char in FLAGS or char == "-": @@ -884,6 +884,8 @@ literal = [] lappend = literal.append def addgroup(index): + if index > pattern.groups: + raise s.error("invalid group reference %r" % index) if literal: literals.append(''.join(literal)) del literal[:] @@ -916,7 +918,7 @@ raise s.error("bad character in group name %r" % name, len(name) + 1) from None if index >= MAXGROUPS: - raise s.error("invalid group reference", + raise s.error("invalid group reference %r" % index, len(name) + 1) addgroup(index) elif c == "0": @@ -966,5 +968,5 @@ for index, group in groups: literals[index] = g(group) or empty except IndexError: - raise error("invalid group reference") + raise error("invalid group reference %r" % index) return empty.join(literals) 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 Thu Oct 20 21:28:45 2016 +0200 @@ -186,18 +186,20 @@ 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' + with self.assertRaisesRegex(re.error, 'invalid group reference 8 at position 2'): + re.sub('x', r'\8', '') # in python2.3 (etc), these loop endlessly in sre_parser.py self.assertEqual(re.sub('(((((((((((x)))))))))))', r'\11', 'x'), 'x') @@ -271,9 +273,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'), '') @@ -559,9 +561,9 @@ def test_re_groupref_overflow(self): self.checkTemplateError('()', r'\g<%s>' % sre_constants.MAXGROUPS, 'xx', - 'invalid group reference', 3) + 'invalid group reference %d' % sre_constants.MAXGROUPS, 3) self.checkPatternError(r'(?P)(?(%d))' % sre_constants.MAXGROUPS, - 'invalid group reference', 10) + 'invalid group reference %d' % sre_constants.MAXGROUPS, 10) def test_re_groupref(self): self.assertEqual(re.match(r'^(\|)?([^()]+)\1$', '|a|').groups(),