summaryrefslogtreecommitdiff
path: root/Lib/sre_parse.py
diff options
context:
space:
mode:
authorFredrik Lundh <fredrik@pythonware.com>2000-10-28 19:30:41 +0000
committerFredrik Lundh <fredrik@pythonware.com>2000-10-28 19:30:41 +0000
commite98062ee86edfc6af02e7c2184a8460fae47f662 (patch)
tree9d55398c7a083175481027bba1cb2e7f07c8b706 /Lib/sre_parse.py
parentfc3380d1df333c8293c67851710e2d9f54bf8a55 (diff)
downloadcpython-e98062ee86edfc6af02e7c2184a8460fae47f662.tar.gz
-- properly reset groups in findall (bug #117612)
-- fixed negative lookbehind to work correctly at the beginning of the target string (bug #117242) -- improved syntax check; you can no longer refer to a group inside itself (bug #110866)
Diffstat (limited to 'Lib/sre_parse.py')
-rw-r--r--Lib/sre_parse.py14
1 files changed, 12 insertions, 2 deletions
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
index 7c36d4f2dc..5334e0661a 100644
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -62,14 +62,20 @@ class Pattern:
# master pattern object. keeps track of global attributes
def __init__(self):
self.flags = 0
+ self.open = []
self.groups = 1
self.groupdict = {}
- def getgroup(self, name=None):
+ def opengroup(self, name=None):
gid = self.groups
self.groups = gid + 1
if name:
self.groupdict[name] = gid
+ self.open.append(gid)
return gid
+ def closegroup(self, gid):
+ self.open.remove(gid)
+ def checkgroup(self, gid):
+ return gid < self.groups and gid not in self.open
class SubPattern:
# a subpattern, in intermediate form
@@ -278,6 +284,8 @@ def _escape(source, escape, state):
# got at least one decimal digit; this is a group reference
group = _group(escape, state.groups)
if group:
+ if not state.checkgroup(group):
+ raise error, "cannot refer to open group"
return GROUPREF, group
raise ValueError
if len(escape) == 2:
@@ -547,10 +555,12 @@ def _parse(source, state):
# anonymous group
group = None
else:
- group = state.getgroup(name)
+ group = state.opengroup(name)
p = _parse_sub(source, state)
if not source.match(")"):
raise error, "unbalanced parenthesis"
+ if group is not None:
+ state.closegroup(group)
subpattern.append((SUBPATTERN, (group, p)))
else:
while 1: