From 0941d9fc64e1429454282667d0ca47740c141943 Mon Sep 17 00:00:00 2001 From: Ezio Melotti Date: Sat, 3 Nov 2012 20:33:08 +0200 Subject: #12759: sre_parse now raises a proper error when the name of the group is missing. Initial patch by Serhiy Storchaka. --- Lib/sre_parse.py | 8 +++++++- Lib/test/test_re.py | 20 ++++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py index 13737ca..9aea56a 100644 --- a/Lib/sre_parse.py +++ b/Lib/sre_parse.py @@ -548,6 +548,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("="): @@ -560,6 +562,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) @@ -612,6 +616,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: @@ -743,7 +749,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 940ba39..5162d4e 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -161,11 +161,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('(?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=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)') + 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') diff --git a/Misc/NEWS b/Misc/NEWS index 3ee301f..ed35c82 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -143,6 +143,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. -- cgit v0.12