From 130a8c386bc1a8de49eadf784fa178869ce01f37 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 23 Apr 2022 12:50:42 +0300 Subject: [PATCH] gh-91308: Simplify parsing inline flag "x" (verbose) (GH-91855) --- Lib/re/_parser.py | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/Lib/re/_parser.py b/Lib/re/_parser.py index 60ec3e8ba8b..b864bf2b108 100644 --- a/Lib/re/_parser.py +++ b/Lib/re/_parser.py @@ -67,9 +67,6 @@ FLAGS = { TYPE_FLAGS = SRE_FLAG_ASCII | SRE_FLAG_LOCALE | SRE_FLAG_UNICODE GLOBAL_FLAGS = SRE_FLAG_DEBUG -class Verbose(Exception): - pass - class State: # keeps track of state for parsing def __init__(self): @@ -448,6 +445,8 @@ def _parse_sub(source, state, verbose, nested): not nested and not items)) if not sourcematch("|"): break + if not nested: + verbose = state.flags & SRE_FLAG_VERBOSE if len(items) == 1: return items[0] @@ -826,8 +825,7 @@ def _parse(source, state, verbose, nested, first=False): raise source.error('global flags not at the start ' 'of the expression', source.tell() - start) - if (state.flags & SRE_FLAG_VERBOSE) and not verbose: - raise Verbose + verbose = state.flags & SRE_FLAG_VERBOSE continue add_flags, del_flags = flags @@ -963,17 +961,7 @@ def parse(str, flags=0, state=None): state.flags = flags state.str = str - try: - p = _parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0) - except Verbose: - # the VERBOSE flag was switched on inside the pattern. to be - # on the safe side, we'll parse the whole thing again... - state = State() - state.flags = flags | SRE_FLAG_VERBOSE - state.str = str - source.seek(0) - p = _parse_sub(source, state, True, 0) - + p = _parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0) p.state.flags = fix_flags(str, p.state.flags) if source.next is not None: