summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/sre_parse.py8
-rw-r--r--Lib/test/test_re.py20
-rw-r--r--Misc/NEWS3
3 files changed, 30 insertions, 1 deletions
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
index 182d1eb..7149dca 100644
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -541,6 +541,8 @@ def _parse(source, state):
break
name = name + char
group = 1
+ if not name:
+ raise error("missing group name")
if not isname(name):
raise error, "bad character in group name"
elif sourcematch("="):
@@ -553,6 +555,8 @@ def _parse(source, state):
if char == ")":
break
name = name + char
+ if not name:
+ raise error("missing group name")
if not isname(name):
raise error, "bad character in group name"
gid = state.groupdict.get(name)
@@ -605,6 +609,8 @@ def _parse(source, state):
break
condname = condname + char
group = 2
+ if not condname:
+ raise error("missing group name")
if isname(condname):
condgroup = state.groupdict.get(condname)
if condgroup is None:
@@ -723,7 +729,7 @@ def parse_template(source, pattern):
break
name = name + char
if not name:
- raise error, "bad group name"
+ raise error, "missing group name"
try:
index = int(name)
if index < 0:
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index 6f6d014..0bceaa2 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -174,11 +174,31 @@ class ReTests(unittest.TestCase):
self.assertEqual(re.sub('x*', '-', 'abxd'), '-a-b-d-')
self.assertEqual(re.sub('x+', '-', 'abxd'), 'ab-d')
+ def test_symbolic_groups(self):
+ re.compile('(?P<a>x)(?P=a)(?(a)y)')
+ re.compile('(?P<a1>x)(?P=a1)(?(a1)y)')
+ self.assertRaises(re.error, re.compile, '(?P<a>)(?P<a>)')
+ self.assertRaises(re.error, re.compile, '(?Px)')
+ self.assertRaises(re.error, re.compile, '(?P=)')
+ self.assertRaises(re.error, re.compile, '(?P=1)')
+ self.assertRaises(re.error, re.compile, '(?P=a)')
+ self.assertRaises(re.error, re.compile, '(?P=a1)')
+ self.assertRaises(re.error, re.compile, '(?P=a.)')
+ self.assertRaises(re.error, re.compile, '(?P<)')
+ self.assertRaises(re.error, re.compile, '(?P<>)')
+ self.assertRaises(re.error, re.compile, '(?P<1>)')
+ self.assertRaises(re.error, re.compile, '(?P<a.>)')
+ self.assertRaises(re.error, re.compile, '(?())')
+ self.assertRaises(re.error, re.compile, '(?(a))')
+ self.assertRaises(re.error, re.compile, '(?(1a))')
+ self.assertRaises(re.error, re.compile, '(?(a.))')
+
def test_symbolic_refs(self):
self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<a', 'xx')
self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<', 'xx')
self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g', 'xx')
self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<a a>', 'xx')
+ self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<>', 'xx')
self.assertRaises(re.error, re.sub, '(?P<a>x)', '\g<1a1>', 'xx')
self.assertRaises(IndexError, re.sub, '(?P<a>x)', '\g<ab>', 'xx')
self.assertRaises(re.error, re.sub, '(?P<a>x)|(?P<b>y)', '\g<b>', 'xx')
diff --git a/Misc/NEWS b/Misc/NEWS
index fedcd35..1d4c347 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -130,6 +130,9 @@ Core and Builtins
Library
-------
+- Issue #12759: sre_parse now raises a proper error when the name of the group
+ is missing. Initial patch by Serhiy Storchaka.
+
- Issue #16152: fix tokenize to ignore whitespace at the end of the code when
no newline is found. Patch by Ned Batchelder.