diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-02-21 12:08:52 +0200 |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-02-21 12:08:52 +0200 |
commit | e95c24cb0edf6c0aa68054f6f4fe722cb10abbab (patch) | |
tree | 79aa9300733a3867e837ca59b447b181c5db82f0 /Lib/sre_parse.py | |
parent | 4de766c5ea167fc08421fe6f3828fa1543e4756c (diff) | |
download | cpython-e95c24cb0edf6c0aa68054f6f4fe722cb10abbab.tar.gz |
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 b56d437c34..df1e6437c7 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 @@ -352,6 +354,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: @@ -630,6 +637,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: @@ -658,7 +670,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 == "=": @@ -689,6 +704,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: |