diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-04-13 18:06:43 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-13 18:06:43 (GMT) |
commit | 5908300e4b0891fc5ab8bd24fba8fac72012eaa7 (patch) | |
tree | 78b1b58197c890909b9d153a7988105498d56659 /Lib/re.py | |
parent | a6e395dffadf8c5124903c01ad69fefa36b1a935 (diff) | |
download | cpython-5908300e4b0891fc5ab8bd24fba8fac72012eaa7.zip cpython-5908300e4b0891fc5ab8bd24fba8fac72012eaa7.tar.gz cpython-5908300e4b0891fc5ab8bd24fba8fac72012eaa7.tar.bz2 |
bpo-29995: re.escape() now escapes only special characters. (#1007)
Diffstat (limited to 'Lib/re.py')
-rw-r--r-- | Lib/re.py | 36 |
1 files changed, 9 insertions, 27 deletions
@@ -241,39 +241,21 @@ def template(pattern, flags=0): "Compile a template pattern, returning a pattern object" return _compile(pattern, flags|T) -_alphanum_str = frozenset( - "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890") -_alphanum_bytes = frozenset( - b"_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890") +# SPECIAL_CHARS +# closing ')', '}' and ']' +# '-' (a range in character set) +# '#' (comment) and WHITESPACE (ignored) in verbose mode +_special_chars_map = {i: '\\' + chr(i) for i in b'()[]{}?*+-|^$\\.# \t\n\r\v\f'} def escape(pattern): """ - Escape all the characters in pattern except ASCII letters, numbers and '_'. + Escape special characters in a string. """ if isinstance(pattern, str): - alphanum = _alphanum_str - s = list(pattern) - for i, c in enumerate(pattern): - if c not in alphanum: - if c == "\000": - s[i] = "\\000" - else: - s[i] = "\\" + c - return "".join(s) + return pattern.translate(_special_chars_map) else: - alphanum = _alphanum_bytes - s = [] - esc = ord(b"\\") - for c in pattern: - if c in alphanum: - s.append(c) - else: - if c == 0: - s.extend(b"\\000") - else: - s.append(esc) - s.append(c) - return bytes(s) + pattern = str(pattern, 'latin1') + return pattern.translate(_special_chars_map).encode('latin1') # -------------------------------------------------------------------- # internals |