summaryrefslogtreecommitdiffstats
path: root/Lib/re.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-04-13 18:06:43 (GMT)
committerGitHub <noreply@github.com>2017-04-13 18:06:43 (GMT)
commit5908300e4b0891fc5ab8bd24fba8fac72012eaa7 (patch)
tree78b1b58197c890909b9d153a7988105498d56659 /Lib/re.py
parenta6e395dffadf8c5124903c01ad69fefa36b1a935 (diff)
downloadcpython-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.py36
1 files changed, 9 insertions, 27 deletions
diff --git a/Lib/re.py b/Lib/re.py
index d321cff..7053edd 100644
--- a/Lib/re.py
+++ b/Lib/re.py
@@ -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