diff options
| author | Serhiy Storchaka <storchaka@gmail.com> | 2015-02-21 10:08:52 (GMT) |
|---|---|---|
| committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-02-21 10:08:52 (GMT) |
| commit | a3369a524c6f862936c1d8a24e23c796aa91f2c7 (patch) | |
| tree | f176fc626404d514a14cef2d95e5c784d1494b55 /Lib/sre_parse.py | |
| parent | a1543cdcd65d9a2be302be0da0cfb9c53c17f806 (diff) | |
| download | cpython-a3369a524c6f862936c1d8a24e23c796aa91f2c7.zip cpython-a3369a524c6f862936c1d8a24e23c796aa91f2c7.tar.gz cpython-a3369a524c6f862936c1d8a24e23c796aa91f2c7.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 b56d437..df1e643 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: |
