diff options
Diffstat (limited to 'Lib/sre_parse.py')
| -rw-r--r-- | Lib/sre_parse.py | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py index 13737ca..045a5eb 100644 --- a/Lib/sre_parse.py +++ b/Lib/sre_parse.py @@ -15,6 +15,7 @@ import sys from sre_constants import * +from _sre import MAXREPEAT SPECIAL_CHARS = ".\\[{()*+?^$|" REPEAT_CHARS = "*+?{" @@ -235,7 +236,7 @@ def _class_escape(source, escape): if code: return code code = CATEGORIES.get(escape) - if code: + if code and code[0] == IN: return code try: c = escape[1:2] @@ -505,10 +506,14 @@ def _parse(source, state): continue if lo: min = int(lo) + if min >= MAXREPEAT: + raise OverflowError("the repetition number is too large") if hi: max = int(hi) - if max < min: - raise error("bad repeat interval") + if max >= MAXREPEAT: + raise OverflowError("the repetition number is too large") + if max < min: + raise error("bad repeat interval") else: raise error("not supported") # figure out which item to repeat @@ -548,6 +553,8 @@ def _parse(source, state): break name = name + char group = 1 + if not name: + raise error("missing group name") if not isname(name): raise error("bad character in group name") elif sourcematch("="): @@ -560,6 +567,8 @@ def _parse(source, state): if char == ")": break name = name + char + if not name: + raise error("missing group name") if not isname(name): raise error("bad character in group name") gid = state.groupdict.get(name) @@ -612,6 +621,8 @@ def _parse(source, state): break condname = condname + char group = 2 + if not condname: + raise error("missing group name") if isname(condname): condgroup = state.groupdict.get(condname) if condgroup is None: @@ -743,7 +754,7 @@ def parse_template(source, pattern): break name = name + char if not name: - raise error("bad group name") + raise error("missing group name") try: index = int(name) if index < 0: |
