Merge #17341: Include name in re error message about invalid group name.

Patch by Jason Michalski.
This commit is contained in:
R David Murray 2013-04-14 13:03:14 -04:00
commit bf71f7d654
4 changed files with 18 additions and 2 deletions

View File

@ -600,7 +600,7 @@ def _parse(source, state):
if not name:
raise error("missing group name")
if not name.isidentifier():
raise error("bad character in group name")
raise error("bad character in group name %r" % name)
elif sourcematch("="):
# named backreference
name = ""
@ -614,7 +614,8 @@ def _parse(source, state):
if not name:
raise error("missing group name")
if not name.isidentifier():
raise error("bad character in group name")
raise error("bad character in backref group name "
"%r" % name)
gid = state.groupdict.get(name)
if gid is None:
raise error("unknown group name")

View File

@ -3,6 +3,7 @@ from test.support import verbose, run_unittest, gc_collect, bigmemtest, _2G, \
import io
import re
from re import Scanner
import sre_constants
import sys
import string
import traceback
@ -1029,6 +1030,16 @@ class ReTests(unittest.TestCase):
self.assertRaises(OverflowError, re.compile, r".{,%d}" % MAXREPEAT)
self.assertRaises(OverflowError, re.compile, r".{%d,}?" % MAXREPEAT)
def test_backref_group_name_in_exception(self):
# Issue 17341: Poor error message when compiling invalid regex
with self.assertRaisesRegex(sre_constants.error, '<foo>'):
re.compile('(?P=<foo>)')
def test_group_name_in_exception(self):
# Issue 17341: Poor error message when compiling invalid regex
with self.assertRaisesRegex(sre_constants.error, '\?foo'):
re.compile('(?P<?foo>)')
def run_re_tests():
from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR

View File

@ -821,6 +821,7 @@ Piotr Meyer
Alexis Métaireau
Steven Miale
Trent Mick
Jason Michalski
Franck Michea
Tom Middleton
Stan Mihai

View File

@ -42,6 +42,9 @@ Core and Builtins
Library
-------
- Issue #17341: Include the invalid name in the error messages from re about
invalid group names.
- Issue #17702: os.environ now raises KeyError with the original environment
variable name (str on UNIX), instead of using the encoded name (bytes on
UNIX).