diff -r 1267d64c14b3 Lib/sre_parse.py --- a/Lib/sre_parse.py Thu Nov 01 14:52:03 2012 +0200 +++ b/Lib/sre_parse.py Thu Nov 01 21:46:28 2012 +0200 @@ -580,6 +580,8 @@ break name = name + char group = 1 + if not name: + raise error("bad group name") if not isname(name): raise error("bad character in group name") elif sourcematch("="): @@ -592,6 +594,8 @@ if char == ")": break name = name + char + if not name: + raise error("bad group name") if not isname(name): raise error("bad character in group name") gid = state.groupdict.get(name) @@ -644,6 +648,8 @@ break condname = condname + char group = 2 + if not condname: + raise error("bad group name") if isname(condname): condgroup = state.groupdict.get(condname) if condgroup is None: diff -r 1267d64c14b3 Lib/test/test_re.py --- a/Lib/test/test_re.py Thu Nov 01 14:52:03 2012 +0200 +++ b/Lib/test/test_re.py Thu Nov 01 21:46:28 2012 +0200 @@ -161,11 +161,29 @@ self.assertEqual(re.sub('x*', '-', 'abxd'), '-a-b-d-') self.assertEqual(re.sub('x+', '-', 'abxd'), 'ab-d') + def test_symbolic_groups(self): + re.compile('(?Px)(?P=a)(?(a)y)') + re.compile('(?Px)(?P=a1)(?(a1)y)') + self.assertRaises(re.error, re.compile, '(?P)(?P)') + 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<)') + self.assertRaises(re.error, re.compile, '(?P<>)') + self.assertRaises(re.error, re.compile, '(?P<1>)') + self.assertRaises(re.error, re.compile, '(?P)') + 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, '(?Px)', '\gx)', '\g<', 'xx') self.assertRaises(re.error, re.sub, '(?Px)', '\g', 'xx') self.assertRaises(re.error, re.sub, '(?Px)', '\g', 'xx') + self.assertRaises(re.error, re.sub, '(?Px)', '\g<>', 'xx') self.assertRaises(re.error, re.sub, '(?Px)', '\g<1a1>', 'xx') self.assertRaises(IndexError, re.sub, '(?Px)', '\g', 'xx') self.assertRaises(re.error, re.sub, '(?Px)|(?Py)', '\g', 'xx')