diff options
-rw-r--r-- | Lib/sre_parse.py | 21 | ||||
-rw-r--r-- | Lib/test/output/test_sre | 2 |
2 files changed, 17 insertions, 6 deletions
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py index 40f2cb5..a6f3082 100644 --- a/Lib/sre_parse.py +++ b/Lib/sre_parse.py @@ -189,9 +189,9 @@ def isname(name): def _group(escape, groups): # check if the escape string represents a valid group try: - group = int(escape[1:]) - if group and group < groups: - return group + gid = int(escape[1:]) + if gid and gid < groups: + return gid except ValueError: pass return None # not a valid group @@ -442,7 +442,20 @@ def _parse(source, state, flags=0): raise error, "illegal character in group name" elif source.match("="): # named backreference - raise error, "not yet implemented" + name = "" + while 1: + char = source.get() + if char is None: + raise error, "unterminated name" + if char == ")": + break + name = name + char + if not isname(name): + raise error, "illegal character in group name" + gid = state.groupdict.get(name) + if gid is None: + raise error, "unknown group name" + subpattern.append((GROUP, gid)) else: char = source.get() if char is None: diff --git a/Lib/test/output/test_sre b/Lib/test/output/test_sre index 65eadf9..75caa55 100644 --- a/Lib/test/output/test_sre +++ b/Lib/test/output/test_sre @@ -1,11 +1,9 @@ test_sre test_support -- test failed re module pickle test_support -- test failed re module cPickle -=== Syntax error: ('(?P<foo_123>a)(?P=foo_123)', 'aa', 0, 'g1', 'a') === Failed incorrectly ('^(.+)?B', 'AB', 0, 'g1', 'A') === Failed incorrectly ('(a+)+\\1', 'aa', 0, 'found+"-"+g1', 'aa-a') === grouping error ('([^/]*/)*sub1/', 'd:msgs/tdir/sub1/trial/away.cpp', 0, 'found+"-"+g1', 'd:msgs/tdir/sub1/-tdir/') 'd:msgs/tdir/sub1/-trial/' should be 'd:msgs/tdir/sub1/-tdir/' -=== Syntax error: ('(?P<id>aa)(?P=id)', 'aaaa', 0, 'found+"-"+id', 'aaaa-aa') === grouping error ('([abc])*bcd', 'abcd', 0, 'found+"-"+g1', 'abcd-a') 'abcd-c' should be 'abcd-a' === grouping error ('(?i)([abc])*bcd', 'ABCD', 0, 'found+"-"+g1', 'ABCD-A') 'ABCD-C' should be 'ABCD-A' === Syntax error: ('a(?!b).', 'abad', 0, 'found', 'ad') |