diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-02-21 10:08:36 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-02-21 10:08:36 (GMT) |
commit | 4809d1fccd81bd3e1e4b08152545cfd88b69231c (patch) | |
tree | f3e5022ed49fbf2b5c4fd972b62572fcf5b06690 /Lib/sre_parse.py | |
parent | 021d55ff745268299f8c3d487aac7f12a01ec294 (diff) | |
download | cpython-4809d1fccd81bd3e1e4b08152545cfd88b69231c.zip cpython-4809d1fccd81bd3e1e4b08152545cfd88b69231c.tar.gz cpython-4809d1fccd81bd3e1e4b08152545cfd88b69231c.tar.bz2 |
Issues #814253, #9179: Warnings now are raised when group references and
conditional group references are used in lookbehind assertions in regular
expressions.
Diffstat (limited to 'Lib/sre_parse.py')
-rw-r--r-- | Lib/sre_parse.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py index b85ce88..c29cc16 100644 --- a/Lib/sre_parse.py +++ b/Lib/sre_parse.py @@ -69,6 +69,8 @@ class Pattern: self.open = [] self.groups = 1 self.groupdict = {} + self.lookbehind = 0 + def opengroup(self, name=None): gid = self.groups self.groups = gid + 1 @@ -299,6 +301,11 @@ def _escape(source, escape, state): if group < state.groups: if not state.checkgroup(group): raise error, "cannot refer to open group" + if state.lookbehind: + import warnings + warnings.warn('group references in lookbehind ' + 'assertions are not supported', + RuntimeWarning) return GROUPREF, group raise ValueError if len(escape) == 2: @@ -578,6 +585,11 @@ def _parse(source, state): if gid is None: msg = "unknown group name: {0!r}".format(name) raise error(msg) + if state.lookbehind: + import warnings + warnings.warn('group references in lookbehind ' + 'assertions are not supported', + RuntimeWarning) subpatternappend((GROUPREF, gid)) continue else: @@ -606,7 +618,10 @@ def _parse(source, state): raise error, "syntax error" dir = -1 # lookbehind char = sourceget() + state.lookbehind += 1 p = _parse_sub(source, state) + if dir < 0: + state.lookbehind -= 1 if not sourcematch(")"): raise error, "unbalanced parenthesis" if char == "=": @@ -637,6 +652,11 @@ def _parse(source, state): condgroup = int(condname) except ValueError: raise error, "bad character in group name" + if state.lookbehind: + import warnings + warnings.warn('group references in lookbehind ' + 'assertions are not supported', + RuntimeWarning) else: # flags if not source.next in FLAGS: |