Issue #27030: Unknown escapes in re.sub() replacement template are allowed

again.  But they still are deprecated and will be disabled in 3.7.
This commit is contained in:
Serhiy Storchaka 2016-12-06 19:15:29 +02:00
parent b0f75c520e
commit 53c53ea4c5
5 changed files with 16 additions and 5 deletions

View File

@ -758,7 +758,12 @@ form.
Unmatched groups are replaced with an empty string. Unmatched groups are replaced with an empty string.
.. versionchanged:: 3.6 .. versionchanged:: 3.6
Unknown escapes consisting of ``'\'`` and an ASCII letter now are errors. Unknown escapes in *pattern* consisting of ``'\'`` and an ASCII letter
now are errors.
.. deprecated-removed:: 3.5 3.7
Unknown escapes in *repl* consist of ``'\'`` and ASCII letter now raise
a deprecation warning and will be forbidden in Python 3.7.
.. function:: subn(pattern, repl, string, count=0, flags=0) .. function:: subn(pattern, repl, string, count=0, flags=0)

View File

@ -2021,8 +2021,9 @@ API and Feature Removals
------------------------ ------------------------
* Unknown escapes consisting of ``'\'`` and an ASCII letter in * Unknown escapes consisting of ``'\'`` and an ASCII letter in
regular expressions will now cause an error. The :const:`re.LOCALE` regular expressions will now cause an error. In replacement templates for
flag can now only be used with binary patterns. :func:`re.sub` they are still allowed, but deprecated.
The :const:`re.LOCALE` flag can now only be used with binary patterns.
* ``inspect.getmoduleinfo()`` was removed (was deprecated since CPython 3.3). * ``inspect.getmoduleinfo()`` was removed (was deprecated since CPython 3.3).
:func:`inspect.getmodulename` should be used for obtaining the module :func:`inspect.getmodulename` should be used for obtaining the module

View File

@ -947,7 +947,9 @@ def parse_template(source, pattern):
this = chr(ESCAPES[this][1]) this = chr(ESCAPES[this][1])
except KeyError: except KeyError:
if c in ASCIILETTERS: if c in ASCIILETTERS:
raise s.error('bad escape %s' % this, len(this)) import warnings
warnings.warn('bad escape %s' % this,
DeprecationWarning, stacklevel=4)
lappend(this) lappend(this)
else: else:
lappend(this) lappend(this)

View File

@ -126,7 +126,7 @@ class ReTests(unittest.TestCase):
(chr(9)+chr(10)+chr(11)+chr(13)+chr(12)+chr(7)+chr(8))) (chr(9)+chr(10)+chr(11)+chr(13)+chr(12)+chr(7)+chr(8)))
for c in 'cdehijklmopqsuwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ': for c in 'cdehijklmopqsuwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ':
with self.subTest(c): with self.subTest(c):
with self.assertRaises(re.error): with self.assertWarns(DeprecationWarning):
self.assertEqual(re.sub('a', '\\' + c, 'a'), '\\' + c) self.assertEqual(re.sub('a', '\\' + c, 'a'), '\\' + c)
self.assertEqual(re.sub(r'^\s*', 'X', 'test'), 'Xtest') self.assertEqual(re.sub(r'^\s*', 'X', 'test'), 'Xtest')

View File

@ -26,6 +26,9 @@ Core and Builtins
Library Library
------- -------
- Issue #27030: Unknown escapes in re.sub() replacement template are allowed
again. But they still are deprecated and will be disabled in 3.7.
- Issue #28835: Fix a regression introduced in warnings.catch_warnings(): - Issue #28835: Fix a regression introduced in warnings.catch_warnings():
call warnings.showwarning() if it was overriden inside the context manager. call warnings.showwarning() if it was overriden inside the context manager.