]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-133306: Use \z instead of \Z in regular expressions in the stdlib (GH-133337)
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 3 May 2025 14:58:49 +0000 (17:58 +0300)
committerGitHub <noreply@github.com>
Sat, 3 May 2025 14:58:49 +0000 (17:58 +0300)
16 files changed:
Lib/_py_warnings.py
Lib/_pydecimal.py
Lib/email/feedparser.py
Lib/fractions.py
Lib/idlelib/pyshell.py
Lib/test/test_asyncio/test_locks.py
Lib/test/test_gc.py
Lib/test/test_import/__init__.py
Lib/test/test_logging.py
Lib/test/test_strtod.py
Lib/test/test_tkinter/widget_tests.py
Lib/test/test_ttk/test_widgets.py
Lib/textwrap.py
Lib/tokenize.py
Lib/urllib/parse.py
Lib/zipfile/_path/glob.py

index 3cdc6ffe19800fb886bf15a418f62b0bb843870a..cbaa94458629ac64280fe32bd4246cb5a42d66ad 100644 (file)
@@ -371,7 +371,7 @@ def _setoption(arg):
     if message:
         message = re.escape(message)
     if module:
-        module = re.escape(module) + r'\Z'
+        module = re.escape(module) + r'\z'
     if lineno:
         try:
             lineno = int(lineno)
index 4b09207eca6facf49681e6163f487c23b40ef1ad..46fa9ffcb1e056536195e8c7fe1c049ef045ce94 100644 (file)
@@ -6096,7 +6096,7 @@ _parser = re.compile(r"""        # A numeric string consists of:
         (?P<diag>\d*)            # with (possibly empty) diagnostic info.
     )
 #    \s*
-    \Z
+    \z
 """, re.VERBOSE | re.IGNORECASE).match
 
 _all_zeros = re.compile('0*$').match
@@ -6124,7 +6124,7 @@ _parse_format_specifier_regex = re.compile(r"""\A
 (?P<thousands_sep>[,_])?
 (?:\.(?P<precision>0|(?!0)\d+))?
 (?P<type>[eEfFgGn%])?
-\Z
+\z
 """, re.VERBOSE|re.DOTALL)
 
 del re
index b2bc4afc1cc26f12f125102b0eda00e93b4067cf..9d80a5822af48db183e24ef9fb4bf457a452b91c 100644 (file)
@@ -30,7 +30,7 @@ from io import StringIO
 
 NLCRE = re.compile(r'\r\n|\r|\n')
 NLCRE_bol = re.compile(r'(\r\n|\r|\n)')
-NLCRE_eol = re.compile(r'(\r\n|\r|\n)\Z')
+NLCRE_eol = re.compile(r'(\r\n|\r|\n)\z')
 NLCRE_crack = re.compile(r'(\r\n|\r|\n)')
 # RFC 2822 $3.6.8 Optional fields.  ftext is %d33-57 / %d59-126, Any character
 # except controls, SP, and ":".
index fa722589fb4f67cb6026a2db6ed3a0ddd31dca43..8163e3bb594f6beefb3acae7757a12be46980c2f 100644 (file)
@@ -64,7 +64,7 @@ _RATIONAL_FORMAT = re.compile(r"""
        (?:\.(?P<decimal>\d*|\d+(_\d+)*))?  # an optional fractional part
        (?:E(?P<exp>[-+]?\d+(_\d+)*))?      # and optional exponent
     )
-    \s*\Z                                  # and optional whitespace to finish
+    \s*\z                                  # and optional whitespace to finish
 """, re.VERBOSE | re.IGNORECASE)
 
 
index 60b63d58cdd8a35b74f24cbf4b9e7a109c8c749d..74a0e03994f69ab36b8c05a51c59102deb83ad64 100755 (executable)
@@ -1350,7 +1350,7 @@ class PyShell(OutputWindow):
             self.text.see("insert")
             self.text.undo_block_stop()
 
-    _last_newline_re = re.compile(r"[ \t]*(\n[ \t]*)?\Z")
+    _last_newline_re = re.compile(r"[ \t]*(\n[ \t]*)?\z")
     def runit(self):
         index_before = self.text.index("end-2c")
         line = self.text.get("iomark", "end-1c")
index 3bb3e5c4ca065848bbfb686c0a7ccab566f37810..047f03cbb14b564faa3c0d3db5d8e786ed1be859 100644 (file)
@@ -14,7 +14,7 @@ STR_RGX_REPR = (
     r'(, value:\d)?'
     r'(, waiters:\d+)?'
     r'(, waiters:\d+\/\d+)?' # barrier
-    r')\]>\Z'
+    r')\]>\z'
 )
 RGX_REPR = re.compile(STR_RGX_REPR)
 
index b5140057a69d36f9d659dee9f4805a8bd3291696..8fae12c478cb3ad83d5d55935fd9a79466d1126e 100644 (file)
@@ -300,7 +300,7 @@ class GCTests(unittest.TestCase):
         # We're mostly just checking that this doesn't crash.
         rc, stdout, stderr = assert_python_ok("-c", code)
         self.assertEqual(rc, 0)
-        self.assertRegex(stdout, rb"""\A\s*func=<function  at \S+>\s*\Z""")
+        self.assertRegex(stdout, rb"""\A\s*func=<function  at \S+>\s*\z""")
         self.assertFalse(stderr)
 
     @refcount_test
index b5f4645847a1e64444b6e42e166a9c60e086edb9..6e34094c5aa422381a9404696ea7790b3064bc23 100644 (file)
@@ -1001,7 +1001,7 @@ from not_a_module import symbol
 
                 expected_error = error + (
                     rb" \(consider renaming '.*numpy.py' if it has the "
-                    rb"same name as a library you intended to import\)\s+\Z"
+                    rb"same name as a library you intended to import\)\s+\z"
                 )
 
                 popen = script_helper.spawn_python(os.path.join(tmp, "numpy.py"))
@@ -1022,14 +1022,14 @@ from not_a_module import symbol
                 f.write("this_script_does_not_attempt_to_import_numpy = True")
 
             expected_error = (
-                rb"AttributeError: module 'numpy' has no attribute 'attr'\s+\Z"
+                rb"AttributeError: module 'numpy' has no attribute 'attr'\s+\z"
             )
             popen = script_helper.spawn_python('-c', 'import numpy; numpy.attr', cwd=tmp)
             stdout, stderr = popen.communicate()
             self.assertRegex(stdout, expected_error)
 
             expected_error = (
-                rb"ImportError: cannot import name 'attr' from 'numpy' \(.*\)\s+\Z"
+                rb"ImportError: cannot import name 'attr' from 'numpy' \(.*\)\s+\z"
             )
             popen = script_helper.spawn_python('-c', 'from numpy import attr', cwd=tmp)
             stdout, stderr = popen.communicate()
index de9108288a72f5f5fdf6560289bd7b3d20a12b40..3f113ec1be47afbf3602fa6dd2c0fba02db11412 100644 (file)
@@ -6740,7 +6740,7 @@ class TimedRotatingFileHandlerTest(BaseFileTest):
             rotator = rotators[i]
             candidates = rotator.getFilesToDelete()
             self.assertEqual(len(candidates), n_files - backupCount, candidates)
-            matcher = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}\Z")
+            matcher = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}\z")
             for c in candidates:
                 d, fn = os.path.split(c)
                 self.assertStartsWith(fn, prefix+'.')
index 2727514fad446963cc2eff88fd8478dabefa7d97..570de390a958821b6bf98f35d857959aad5d9663 100644 (file)
@@ -19,7 +19,7 @@ strtod_parser = re.compile(r"""    # A numeric string consists of:
     (?P<int>\d*)             # having a (possibly empty) integer part
     (?:\.(?P<frac>\d*))?     # followed by an optional fractional part
     (?:E(?P<exp>[-+]?\d+))?  # and an optional exponent
-    \Z
+    \z
 """, re.VERBOSE | re.IGNORECASE).match
 
 # Pure Python version of correctly rounded string->float conversion.
index ac7fb5977e04fc95abca28a6e947c952777967cd..f518925e994e90836b1b98d9a3993c29a486a828 100644 (file)
@@ -65,7 +65,7 @@ class AbstractWidgetTest(AbstractTkTest):
         orig = widget[name]
         if errmsg is not None:
             errmsg = errmsg.format(re.escape(str(value)))
-            errmsg = fr'\A{errmsg}\Z'
+            errmsg = fr'\A{errmsg}\z'
         with self.assertRaisesRegex(tkinter.TclError, errmsg or ''):
             widget[name] = value
         self.assertEqual(widget[name], orig)
index d5620becfa718798190aa165a38ba70a6a80ae00..f33da2a8848738b691fda1f8d29726b1353896fb 100644 (file)
@@ -490,7 +490,7 @@ class ComboboxTest(EntryTest, unittest.TestCase):
         width = self.combo.winfo_width()
         x, y = width - 5, 5
         if sys.platform != 'darwin':  # there's no down arrow on macOS
-            self.assertRegex(self.combo.identify(x, y), r'.*downarrow\Z')
+            self.assertRegex(self.combo.identify(x, y), r'.*downarrow\z')
         self.combo.event_generate('<Button-1>', x=x, y=y)
         self.combo.event_generate('<ButtonRelease-1>', x=x, y=y)
 
@@ -1250,7 +1250,7 @@ class SpinboxTest(EntryTest, unittest.TestCase):
         height = self.spin.winfo_height()
         x = width - 5
         y = height//2 - 5
-        self.assertRegex(self.spin.identify(x, y), r'.*uparrow\Z')
+        self.assertRegex(self.spin.identify(x, y), r'.*uparrow\z')
         self.spin.event_generate('<ButtonPress-1>', x=x, y=y)
         self.spin.event_generate('<ButtonRelease-1>', x=x, y=y)
         self.spin.update_idletasks()
@@ -1260,7 +1260,7 @@ class SpinboxTest(EntryTest, unittest.TestCase):
         height = self.spin.winfo_height()
         x = width - 5
         y = height//2 + 4
-        self.assertRegex(self.spin.identify(x, y), r'.*downarrow\Z')
+        self.assertRegex(self.spin.identify(x, y), r'.*downarrow\z')
         self.spin.event_generate('<ButtonPress-1>', x=x, y=y)
         self.spin.event_generate('<ButtonRelease-1>', x=x, y=y)
         self.spin.update_idletasks()
index 00465f67d0941a70f885eca09e772309a7e49e9e..5ae439f5cd3b784594cd87cadc476c65db2453b6 100644 (file)
@@ -86,7 +86,7 @@ class TextWrapper:
               -(?: (?<=%(lt)s{2}-) | (?<=%(lt)s-%(lt)s-))
               (?= %(lt)s -? %(lt)s)
             | # end of word
-              (?=%(ws)s|\Z)
+              (?=%(ws)s|\z)
             | # em-dash
               (?<=%(wp)s) (?=-{2,}\w)
             )
@@ -107,7 +107,7 @@ class TextWrapper:
     sentence_end_re = re.compile(r'[a-z]'             # lowercase letter
                                  r'[\.\!\?]'          # sentence-ending punct.
                                  r'[\"\']?'           # optional end-of-quote
-                                 r'\Z')               # end of chunk
+                                 r'\z')               # end of chunk
 
     def __init__(self,
                  width=70,
index edb1ed8bdb8c9cd67f5feb3e0340b2aba3f55e94..117b485b9344e62435193ee85e408ced2623c332 100644 (file)
@@ -132,7 +132,7 @@ ContStr = group(StringPrefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*" +
                 group("'", r'\\\r?\n'),
                 StringPrefix + r'"[^\n"\\]*(?:\\.[^\n"\\]*)*' +
                 group('"', r'\\\r?\n'))
-PseudoExtras = group(r'\\\r?\n|\Z', Comment, Triple)
+PseudoExtras = group(r'\\\r?\n|\z', Comment, Triple)
 PseudoToken = Whitespace + group(PseudoExtras, Number, Funny, ContStr, Name)
 
 # For a given string prefix plus quotes, endpats maps it to a regex
index 9d51f4c6812b57e309461ba5c3beb40277aaa6bb..67d9bbea0d31503d61871b49ca840ec7d999ab27 100644 (file)
@@ -460,7 +460,7 @@ def _check_bracketed_netloc(netloc):
 # https://www.rfc-editor.org/rfc/rfc3986#page-49 and https://url.spec.whatwg.org/
 def _check_bracketed_host(hostname):
     if hostname.startswith('v'):
-        if not re.match(r"\Av[a-fA-F0-9]+\..+\Z", hostname):
+        if not re.match(r"\Av[a-fA-F0-9]+\..+\z", hostname):
             raise ValueError(f"IPvFuture address is invalid")
     else:
         ip = ipaddress.ip_address(hostname) # Throws Value Error if not IPv6 or IPv4
index 4320f1c0badcf91cd75811e32e721a588488b86c..d7fe45a494717ac92d97cc89ef8bf04a8dc4df3b 100644 (file)
@@ -37,9 +37,9 @@ class Translator:
         Apply '(?s:)' to create a non-matching group that
         matches newlines (valid on Unix).
 
-        Append '\Z' to imply fullmatch even when match is used.
+        Append '\z' to imply fullmatch even when match is used.
         """
-        return rf'(?s:{pattern})\Z'
+        return rf'(?s:{pattern})\z'
 
     def match_dirs(self, pattern):
         """