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(),