diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-10-24 23:31:42 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-24 23:31:42 +0300 |
commit | 3557b05c5a7dfd7d97ddfd3b79aefd53d25e5132 (patch) | |
tree | aa741f0d09293f6dfe9668a5b328658ce13c8279 /Lib/sre_parse.py | |
parent | fdd9b217c60b454ac6a82f02c8b0b551caeac88b (diff) | |
download | cpython-git-3557b05c5a7dfd7d97ddfd3b79aefd53d25e5132.tar.gz |
bpo-31690: Allow the inline flags "a", "L", and "u" to be used as group flags for RE. (#3885)
Diffstat (limited to 'Lib/sre_parse.py')
-rw-r--r-- | Lib/sre_parse.py | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py index 545252074f..8527412293 100644 --- a/Lib/sre_parse.py +++ b/Lib/sre_parse.py @@ -65,8 +65,8 @@ FLAGS = { "u": SRE_FLAG_UNICODE, } -GLOBAL_FLAGS = (SRE_FLAG_ASCII | SRE_FLAG_LOCALE | SRE_FLAG_UNICODE | - SRE_FLAG_DEBUG | SRE_FLAG_TEMPLATE) +TYPE_FLAGS = SRE_FLAG_ASCII | SRE_FLAG_LOCALE | SRE_FLAG_UNICODE +GLOBAL_FLAGS = SRE_FLAG_DEBUG | SRE_FLAG_TEMPLATE class Verbose(Exception): pass @@ -822,7 +822,19 @@ def _parse_flags(source, state, char): del_flags = 0 if char != "-": while True: - add_flags |= FLAGS[char] + flag = FLAGS[char] + if source.istext: + if char == 'L': + msg = "bad inline flags: cannot use 'L' flag with a str pattern" + raise source.error(msg) + else: + if char == 'u': + msg = "bad inline flags: cannot use 'u' flag with a bytes pattern" + raise source.error(msg) + add_flags |= flag + if (flag & TYPE_FLAGS) and (add_flags & TYPE_FLAGS) != flag: + msg = "bad inline flags: flags 'a', 'u' and 'L' are incompatible" + raise source.error(msg) char = sourceget() if char is None: raise source.error("missing -, : or )") @@ -844,7 +856,11 @@ def _parse_flags(source, state, char): msg = "unknown flag" if char.isalpha() else "missing flag" raise source.error(msg, len(char)) while True: - del_flags |= FLAGS[char] + flag = FLAGS[char] + if flag & TYPE_FLAGS: + msg = "bad inline flags: cannot turn off flags 'a', 'u' and 'L'" + raise source.error(msg) + del_flags |= flag char = sourceget() if char is None: raise source.error("missing :") |