Skip to content

Commit 31ef90e

Browse files
gh-133306: Use \z instead of \Z in regular expressions in the stdlib
1 parent 77c391a commit 31ef90e

File tree

18 files changed

+112
-112
lines changed

18 files changed

+112
-112
lines changed

Lib/_py_warnings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ def _setoption(arg):
371371
if message:
372372
message = re.escape(message)
373373
if module:
374-
module = re.escape(module) + r'\Z'
374+
module = re.escape(module) + r'\z'
375375
if lineno:
376376
try:
377377
lineno = int(lineno)

Lib/_pydecimal.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6096,7 +6096,7 @@ def _convert_for_comparison(self, other, equality_op=False):
60966096
(?P<diag>\d*) # with (possibly empty) diagnostic info.
60976097
)
60986098
# \s*
6099-
\Z
6099+
\z
61006100
""", re.VERBOSE | re.IGNORECASE).match
61016101

61026102
_all_zeros = re.compile('0*$').match
@@ -6124,7 +6124,7 @@ def _convert_for_comparison(self, other, equality_op=False):
61246124
(?P<thousands_sep>[,_])?
61256125
(?:\.(?P<precision>0|(?!0)\d+))?
61266126
(?P<type>[eEfFgGn%])?
6127-
\Z
6127+
\z
61286128
""", re.VERBOSE|re.DOTALL)
61296129

61306130
del re

Lib/email/feedparser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
NLCRE = re.compile(r'\r\n|\r|\n')
3232
NLCRE_bol = re.compile(r'(\r\n|\r|\n)')
33-
NLCRE_eol = re.compile(r'(\r\n|\r|\n)\Z')
33+
NLCRE_eol = re.compile(r'(\r\n|\r|\n)\z')
3434
NLCRE_crack = re.compile(r'(\r\n|\r|\n)')
3535
# RFC 2822 $3.6.8 Optional fields. ftext is %d33-57 / %d59-126, Any character
3636
# except controls, SP, and ":".

Lib/fractions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def _hash_algorithm(numerator, denominator):
6464
(?:\.(?P<decimal>\d*|\d+(_\d+)*))? # an optional fractional part
6565
(?:E(?P<exp>[-+]?\d+(_\d+)*))? # and optional exponent
6666
)
67-
\s*\Z # and optional whitespace to finish
67+
\s*\z # and optional whitespace to finish
6868
""", re.VERBOSE | re.IGNORECASE)
6969

7070

Lib/idlelib/pyshell.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1350,7 +1350,7 @@ def recall(self, s, event):
13501350
self.text.see("insert")
13511351
self.text.undo_block_stop()
13521352

1353-
_last_newline_re = re.compile(r"[ \t]*(\n[ \t]*)?\Z")
1353+
_last_newline_re = re.compile(r"[ \t]*(\n[ \t]*)?\z")
13541354
def runit(self):
13551355
index_before = self.text.index("end-2c")
13561356
line = self.text.get("iomark", "end-1c")

Lib/test/test_asyncio/test_locks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
r'(, value:\d)?'
1515
r'(, waiters:\d+)?'
1616
r'(, waiters:\d+\/\d+)?' # barrier
17-
r')\]>\Z'
17+
r')\]>\z'
1818
)
1919
RGX_REPR = re.compile(STR_RGX_REPR)
2020

Lib/test/test_fnmatch.py

Lines changed: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -218,24 +218,24 @@ class TranslateTestCase(unittest.TestCase):
218218

219219
def test_translate(self):
220220
import re
221-
self.assertEqual(translate('*'), r'(?s:.*)\Z')
222-
self.assertEqual(translate('?'), r'(?s:.)\Z')
223-
self.assertEqual(translate('a?b*'), r'(?s:a.b.*)\Z')
224-
self.assertEqual(translate('[abc]'), r'(?s:[abc])\Z')
225-
self.assertEqual(translate('[]]'), r'(?s:[]])\Z')
226-
self.assertEqual(translate('[!x]'), r'(?s:[^x])\Z')
227-
self.assertEqual(translate('[^x]'), r'(?s:[\^x])\Z')
228-
self.assertEqual(translate('[x'), r'(?s:\[x)\Z')
221+
self.assertEqual(translate('*'), r'(?s:.*)\z')
222+
self.assertEqual(translate('?'), r'(?s:.)\z')
223+
self.assertEqual(translate('a?b*'), r'(?s:a.b.*)\z')
224+
self.assertEqual(translate('[abc]'), r'(?s:[abc])\z')
225+
self.assertEqual(translate('[]]'), r'(?s:[]])\z')
226+
self.assertEqual(translate('[!x]'), r'(?s:[^x])\z')
227+
self.assertEqual(translate('[^x]'), r'(?s:[\^x])\z')
228+
self.assertEqual(translate('[x'), r'(?s:\[x)\z')
229229
# from the docs
230-
self.assertEqual(translate('*.txt'), r'(?s:.*\.txt)\Z')
230+
self.assertEqual(translate('*.txt'), r'(?s:.*\.txt)\z')
231231
# squash consecutive stars
232-
self.assertEqual(translate('*********'), r'(?s:.*)\Z')
233-
self.assertEqual(translate('A*********'), r'(?s:A.*)\Z')
234-
self.assertEqual(translate('*********A'), r'(?s:.*A)\Z')
235-
self.assertEqual(translate('A*********?[?]?'), r'(?s:A.*.[?].)\Z')
232+
self.assertEqual(translate('*********'), r'(?s:.*)\z')
233+
self.assertEqual(translate('A*********'), r'(?s:A.*)\z')
234+
self.assertEqual(translate('*********A'), r'(?s:.*A)\z')
235+
self.assertEqual(translate('A*********?[?]?'), r'(?s:A.*.[?].)\z')
236236
# fancy translation to prevent exponential-time match failure
237237
t = translate('**a*a****a')
238-
self.assertEqual(t, r'(?s:(?>.*?a)(?>.*?a).*a)\Z')
238+
self.assertEqual(t, r'(?s:(?>.*?a)(?>.*?a).*a)\z')
239239
# and try pasting multiple translate results - it's an undocumented
240240
# feature that this works
241241
r1 = translate('**a**a**a*')
@@ -249,56 +249,56 @@ def test_translate(self):
249249

250250
def test_translate_wildcards(self):
251251
for pattern, expect in [
252-
('ab*', r'(?s:ab.*)\Z'),
253-
('ab*cd', r'(?s:ab.*cd)\Z'),
254-
('ab*cd*', r'(?s:ab(?>.*?cd).*)\Z'),
255-
('ab*cd*12', r'(?s:ab(?>.*?cd).*12)\Z'),
256-
('ab*cd*12*', r'(?s:ab(?>.*?cd)(?>.*?12).*)\Z'),
257-
('ab*cd*12*34', r'(?s:ab(?>.*?cd)(?>.*?12).*34)\Z'),
258-
('ab*cd*12*34*', r'(?s:ab(?>.*?cd)(?>.*?12)(?>.*?34).*)\Z'),
252+
('ab*', r'(?s:ab.*)\z'),
253+
('ab*cd', r'(?s:ab.*cd)\z'),
254+
('ab*cd*', r'(?s:ab(?>.*?cd).*)\z'),
255+
('ab*cd*12', r'(?s:ab(?>.*?cd).*12)\z'),
256+
('ab*cd*12*', r'(?s:ab(?>.*?cd)(?>.*?12).*)\z'),
257+
('ab*cd*12*34', r'(?s:ab(?>.*?cd)(?>.*?12).*34)\z'),
258+
('ab*cd*12*34*', r'(?s:ab(?>.*?cd)(?>.*?12)(?>.*?34).*)\z'),
259259
]:
260260
with self.subTest(pattern):
261261
translated = translate(pattern)
262262
self.assertEqual(translated, expect, pattern)
263263

264264
for pattern, expect in [
265-
('*ab', r'(?s:.*ab)\Z'),
266-
('*ab*', r'(?s:(?>.*?ab).*)\Z'),
267-
('*ab*cd', r'(?s:(?>.*?ab).*cd)\Z'),
268-
('*ab*cd*', r'(?s:(?>.*?ab)(?>.*?cd).*)\Z'),
269-
('*ab*cd*12', r'(?s:(?>.*?ab)(?>.*?cd).*12)\Z'),
270-
('*ab*cd*12*', r'(?s:(?>.*?ab)(?>.*?cd)(?>.*?12).*)\Z'),
271-
('*ab*cd*12*34', r'(?s:(?>.*?ab)(?>.*?cd)(?>.*?12).*34)\Z'),
272-
('*ab*cd*12*34*', r'(?s:(?>.*?ab)(?>.*?cd)(?>.*?12)(?>.*?34).*)\Z'),
265+
('*ab', r'(?s:.*ab)\z'),
266+
('*ab*', r'(?s:(?>.*?ab).*)\z'),
267+
('*ab*cd', r'(?s:(?>.*?ab).*cd)\z'),
268+
('*ab*cd*', r'(?s:(?>.*?ab)(?>.*?cd).*)\z'),
269+
('*ab*cd*12', r'(?s:(?>.*?ab)(?>.*?cd).*12)\z'),
270+
('*ab*cd*12*', r'(?s:(?>.*?ab)(?>.*?cd)(?>.*?12).*)\z'),
271+
('*ab*cd*12*34', r'(?s:(?>.*?ab)(?>.*?cd)(?>.*?12).*34)\z'),
272+
('*ab*cd*12*34*', r'(?s:(?>.*?ab)(?>.*?cd)(?>.*?12)(?>.*?34).*)\z'),
273273
]:
274274
with self.subTest(pattern):
275275
translated = translate(pattern)
276276
self.assertEqual(translated, expect, pattern)
277277

278278
def test_translate_expressions(self):
279279
for pattern, expect in [
280-
('[', r'(?s:\[)\Z'),
281-
('[!', r'(?s:\[!)\Z'),
282-
('[]', r'(?s:\[\])\Z'),
283-
('[abc', r'(?s:\[abc)\Z'),
284-
('[!abc', r'(?s:\[!abc)\Z'),
285-
('[abc]', r'(?s:[abc])\Z'),
286-
('[!abc]', r'(?s:[^abc])\Z'),
287-
('[!abc][!def]', r'(?s:[^abc][^def])\Z'),
280+
('[', r'(?s:\[)\z'),
281+
('[!', r'(?s:\[!)\z'),
282+
('[]', r'(?s:\[\])\z'),
283+
('[abc', r'(?s:\[abc)\z'),
284+
('[!abc', r'(?s:\[!abc)\z'),
285+
('[abc]', r'(?s:[abc])\z'),
286+
('[!abc]', r'(?s:[^abc])\z'),
287+
('[!abc][!def]', r'(?s:[^abc][^def])\z'),
288288
# with [[
289-
('[[', r'(?s:\[\[)\Z'),
290-
('[[a', r'(?s:\[\[a)\Z'),
291-
('[[]', r'(?s:[\[])\Z'),
292-
('[[]a', r'(?s:[\[]a)\Z'),
293-
('[[]]', r'(?s:[\[]\])\Z'),
294-
('[[]a]', r'(?s:[\[]a\])\Z'),
295-
('[[a]', r'(?s:[\[a])\Z'),
296-
('[[a]]', r'(?s:[\[a]\])\Z'),
297-
('[[a]b', r'(?s:[\[a]b)\Z'),
289+
('[[', r'(?s:\[\[)\z'),
290+
('[[a', r'(?s:\[\[a)\z'),
291+
('[[]', r'(?s:[\[])\z'),
292+
('[[]a', r'(?s:[\[]a)\z'),
293+
('[[]]', r'(?s:[\[]\])\z'),
294+
('[[]a]', r'(?s:[\[]a\])\z'),
295+
('[[a]', r'(?s:[\[a])\z'),
296+
('[[a]]', r'(?s:[\[a]\])\z'),
297+
('[[a]b', r'(?s:[\[a]b)\z'),
298298
# backslashes
299-
('[\\', r'(?s:\[\\)\Z'),
300-
(r'[\]', r'(?s:[\\])\Z'),
301-
(r'[\\]', r'(?s:[\\\\])\Z'),
299+
('[\\', r'(?s:\[\\)\z'),
300+
(r'[\]', r'(?s:[\\])\z'),
301+
(r'[\\]', r'(?s:[\\\\])\z'),
302302
]:
303303
with self.subTest(pattern):
304304
translated = translate(pattern)

Lib/test/test_gc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ def func():
300300
# We're mostly just checking that this doesn't crash.
301301
rc, stdout, stderr = assert_python_ok("-c", code)
302302
self.assertEqual(rc, 0)
303-
self.assertRegex(stdout, rb"""\A\s*func=<function at \S+>\s*\Z""")
303+
self.assertRegex(stdout, rb"""\A\s*func=<function at \S+>\s*\z""")
304304
self.assertFalse(stderr)
305305

306306
@refcount_test

Lib/test/test_glob.py

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -459,59 +459,59 @@ def test_translate_matching(self):
459459
def test_translate(self):
460460
def fn(pat):
461461
return glob.translate(pat, seps='/')
462-
self.assertEqual(fn('foo'), r'(?s:foo)\Z')
463-
self.assertEqual(fn('foo/bar'), r'(?s:foo/bar)\Z')
464-
self.assertEqual(fn('*'), r'(?s:[^/.][^/]*)\Z')
465-
self.assertEqual(fn('?'), r'(?s:(?!\.)[^/])\Z')
466-
self.assertEqual(fn('a*'), r'(?s:a[^/]*)\Z')
467-
self.assertEqual(fn('*a'), r'(?s:(?!\.)[^/]*a)\Z')
468-
self.assertEqual(fn('.*'), r'(?s:\.[^/]*)\Z')
469-
self.assertEqual(fn('?aa'), r'(?s:(?!\.)[^/]aa)\Z')
470-
self.assertEqual(fn('aa?'), r'(?s:aa[^/])\Z')
471-
self.assertEqual(fn('aa[ab]'), r'(?s:aa[ab])\Z')
472-
self.assertEqual(fn('**'), r'(?s:(?!\.)[^/]*)\Z')
473-
self.assertEqual(fn('***'), r'(?s:(?!\.)[^/]*)\Z')
474-
self.assertEqual(fn('a**'), r'(?s:a[^/]*)\Z')
475-
self.assertEqual(fn('**b'), r'(?s:(?!\.)[^/]*b)\Z')
462+
self.assertEqual(fn('foo'), r'(?s:foo)\z')
463+
self.assertEqual(fn('foo/bar'), r'(?s:foo/bar)\z')
464+
self.assertEqual(fn('*'), r'(?s:[^/.][^/]*)\z')
465+
self.assertEqual(fn('?'), r'(?s:(?!\.)[^/])\z')
466+
self.assertEqual(fn('a*'), r'(?s:a[^/]*)\z')
467+
self.assertEqual(fn('*a'), r'(?s:(?!\.)[^/]*a)\z')
468+
self.assertEqual(fn('.*'), r'(?s:\.[^/]*)\z')
469+
self.assertEqual(fn('?aa'), r'(?s:(?!\.)[^/]aa)\z')
470+
self.assertEqual(fn('aa?'), r'(?s:aa[^/])\z')
471+
self.assertEqual(fn('aa[ab]'), r'(?s:aa[ab])\z')
472+
self.assertEqual(fn('**'), r'(?s:(?!\.)[^/]*)\z')
473+
self.assertEqual(fn('***'), r'(?s:(?!\.)[^/]*)\z')
474+
self.assertEqual(fn('a**'), r'(?s:a[^/]*)\z')
475+
self.assertEqual(fn('**b'), r'(?s:(?!\.)[^/]*b)\z')
476476
self.assertEqual(fn('/**/*/*.*/**'),
477-
r'(?s:/(?!\.)[^/]*/[^/.][^/]*/(?!\.)[^/]*\.[^/]*/(?!\.)[^/]*)\Z')
477+
r'(?s:/(?!\.)[^/]*/[^/.][^/]*/(?!\.)[^/]*\.[^/]*/(?!\.)[^/]*)\z')
478478

479479
def test_translate_include_hidden(self):
480480
def fn(pat):
481481
return glob.translate(pat, include_hidden=True, seps='/')
482-
self.assertEqual(fn('foo'), r'(?s:foo)\Z')
483-
self.assertEqual(fn('foo/bar'), r'(?s:foo/bar)\Z')
484-
self.assertEqual(fn('*'), r'(?s:[^/]+)\Z')
485-
self.assertEqual(fn('?'), r'(?s:[^/])\Z')
486-
self.assertEqual(fn('a*'), r'(?s:a[^/]*)\Z')
487-
self.assertEqual(fn('*a'), r'(?s:[^/]*a)\Z')
488-
self.assertEqual(fn('.*'), r'(?s:\.[^/]*)\Z')
489-
self.assertEqual(fn('?aa'), r'(?s:[^/]aa)\Z')
490-
self.assertEqual(fn('aa?'), r'(?s:aa[^/])\Z')
491-
self.assertEqual(fn('aa[ab]'), r'(?s:aa[ab])\Z')
492-
self.assertEqual(fn('**'), r'(?s:[^/]*)\Z')
493-
self.assertEqual(fn('***'), r'(?s:[^/]*)\Z')
494-
self.assertEqual(fn('a**'), r'(?s:a[^/]*)\Z')
495-
self.assertEqual(fn('**b'), r'(?s:[^/]*b)\Z')
496-
self.assertEqual(fn('/**/*/*.*/**'), r'(?s:/[^/]*/[^/]+/[^/]*\.[^/]*/[^/]*)\Z')
482+
self.assertEqual(fn('foo'), r'(?s:foo)\z')
483+
self.assertEqual(fn('foo/bar'), r'(?s:foo/bar)\z')
484+
self.assertEqual(fn('*'), r'(?s:[^/]+)\z')
485+
self.assertEqual(fn('?'), r'(?s:[^/])\z')
486+
self.assertEqual(fn('a*'), r'(?s:a[^/]*)\z')
487+
self.assertEqual(fn('*a'), r'(?s:[^/]*a)\z')
488+
self.assertEqual(fn('.*'), r'(?s:\.[^/]*)\z')
489+
self.assertEqual(fn('?aa'), r'(?s:[^/]aa)\z')
490+
self.assertEqual(fn('aa?'), r'(?s:aa[^/])\z')
491+
self.assertEqual(fn('aa[ab]'), r'(?s:aa[ab])\z')
492+
self.assertEqual(fn('**'), r'(?s:[^/]*)\z')
493+
self.assertEqual(fn('***'), r'(?s:[^/]*)\z')
494+
self.assertEqual(fn('a**'), r'(?s:a[^/]*)\z')
495+
self.assertEqual(fn('**b'), r'(?s:[^/]*b)\z')
496+
self.assertEqual(fn('/**/*/*.*/**'), r'(?s:/[^/]*/[^/]+/[^/]*\.[^/]*/[^/]*)\z')
497497

498498
def test_translate_recursive(self):
499499
def fn(pat):
500500
return glob.translate(pat, recursive=True, include_hidden=True, seps='/')
501-
self.assertEqual(fn('*'), r'(?s:[^/]+)\Z')
502-
self.assertEqual(fn('?'), r'(?s:[^/])\Z')
503-
self.assertEqual(fn('**'), r'(?s:.*)\Z')
504-
self.assertEqual(fn('**/**'), r'(?s:.*)\Z')
505-
self.assertEqual(fn('***'), r'(?s:[^/]*)\Z')
506-
self.assertEqual(fn('a**'), r'(?s:a[^/]*)\Z')
507-
self.assertEqual(fn('**b'), r'(?s:[^/]*b)\Z')
508-
self.assertEqual(fn('/**/*/*.*/**'), r'(?s:/(?:.+/)?[^/]+/[^/]*\.[^/]*/.*)\Z')
501+
self.assertEqual(fn('*'), r'(?s:[^/]+)\z')
502+
self.assertEqual(fn('?'), r'(?s:[^/])\z')
503+
self.assertEqual(fn('**'), r'(?s:.*)\z')
504+
self.assertEqual(fn('**/**'), r'(?s:.*)\z')
505+
self.assertEqual(fn('***'), r'(?s:[^/]*)\z')
506+
self.assertEqual(fn('a**'), r'(?s:a[^/]*)\z')
507+
self.assertEqual(fn('**b'), r'(?s:[^/]*b)\z')
508+
self.assertEqual(fn('/**/*/*.*/**'), r'(?s:/(?:.+/)?[^/]+/[^/]*\.[^/]*/.*)\z')
509509

510510
def test_translate_seps(self):
511511
def fn(pat):
512512
return glob.translate(pat, recursive=True, include_hidden=True, seps=['/', '\\'])
513-
self.assertEqual(fn('foo/bar\\baz'), r'(?s:foo[/\\]bar[/\\]baz)\Z')
514-
self.assertEqual(fn('**/*'), r'(?s:(?:.+[/\\])?[^/\\]+)\Z')
513+
self.assertEqual(fn('foo/bar\\baz'), r'(?s:foo[/\\]bar[/\\]baz)\z')
514+
self.assertEqual(fn('**/*'), r'(?s:(?:.+[/\\])?[^/\\]+)\z')
515515

516516

517517
if __name__ == "__main__":

Lib/test/test_import/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,7 +1001,7 @@ def test_script_shadowing_third_party(self):
10011001

10021002
expected_error = error + (
10031003
rb" \(consider renaming '.*numpy.py' if it has the "
1004-
rb"same name as a library you intended to import\)\s+\Z"
1004+
rb"same name as a library you intended to import\)\s+\z"
10051005
)
10061006

10071007
popen = script_helper.spawn_python(os.path.join(tmp, "numpy.py"))
@@ -1022,14 +1022,14 @@ def test_script_maybe_not_shadowing_third_party(self):
10221022
f.write("this_script_does_not_attempt_to_import_numpy = True")
10231023

10241024
expected_error = (
1025-
rb"AttributeError: module 'numpy' has no attribute 'attr'\s+\Z"
1025+
rb"AttributeError: module 'numpy' has no attribute 'attr'\s+\z"
10261026
)
10271027
popen = script_helper.spawn_python('-c', 'import numpy; numpy.attr', cwd=tmp)
10281028
stdout, stderr = popen.communicate()
10291029
self.assertRegex(stdout, expected_error)
10301030

10311031
expected_error = (
1032-
rb"ImportError: cannot import name 'attr' from 'numpy' \(.*\)\s+\Z"
1032+
rb"ImportError: cannot import name 'attr' from 'numpy' \(.*\)\s+\z"
10331033
)
10341034
popen = script_helper.spawn_python('-c', 'from numpy import attr', cwd=tmp)
10351035
stdout, stderr = popen.communicate()

0 commit comments

Comments
 (0)