From e256b408889eba867e1d90e5e1a0904843256255 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Tue, 21 Nov 2017 10:28:13 -0500 Subject: [PATCH] bpo-31672 - Add one last minor clarification for idpattern (#4483) Add one last minor clarification for idpattern --- Doc/library/string.rst | 6 ++++-- Lib/string.py | 11 +++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 5b254285257..e9606783ef7 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -755,13 +755,15 @@ attributes: * *idpattern* -- This is the regular expression describing the pattern for non-braced placeholders. The default value is the regular expression - ``(?-i:[_a-zA-Z][_a-zA-Z0-9]*)``. If this is given and *braceidpattern* is + ``(?a:[_a-zA-Z][_a-zA-Z0-9]*)``. If this is given and *braceidpattern* is ``None`` this pattern will also apply to braced placeholders. .. note:: Since default *flags* is ``re.IGNORECASE``, pattern ``[a-z]`` can match - with some non-ASCII characters. That's why we use local ``-i`` flag here. + with some non-ASCII characters. That's why we use the local ``a`` flag + here. Further, with the default *flags* value, including ``A-Z`` in the + ranges is redundant, but required for backward compatibility. While *flags* is kept to ``re.IGNORECASE`` for backward compatibility, you can override it to ``0`` or ``re.IGNORECASE | re.ASCII`` when diff --git a/Lib/string.py b/Lib/string.py index a3e6d91bb4a..fd4b1f7a62f 100644 --- a/Lib/string.py +++ b/Lib/string.py @@ -79,11 +79,14 @@ class Template(metaclass=_TemplateMetaclass): """A string class for supporting $-substitutions.""" delimiter = '$' - # r'[a-z]' matches to non-ASCII letters when used with IGNORECASE, - # but without ASCII flag. We can't add re.ASCII to flags because of - # backward compatibility. So we use local -i flag and [a-zA-Z] pattern. + # r'[a-z]' matches to non-ASCII letters when used with IGNORECASE, but + # without the ASCII flag. We can't add re.ASCII to flags because of + # backward compatibility. So we use the ?a local flag and [a-z] pattern. + # We also can't remove the A-Z ranges, because although they are + # technically redundant with the IGNORECASE flag, the value is part of the + # publicly documented API. # See https://bugs.python.org/issue31672 - idpattern = r'(?-i:[_a-zA-Z][_a-zA-Z0-9]*)' + idpattern = r'(?a:[_a-zA-Z][_a-zA-Z0-9]*)' braceidpattern = None flags = _re.IGNORECASE