diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2023-10-14 06:13:02 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-14 06:13:02 (GMT) |
commit | e2b3d831fd2824d8a5713e3ed2a64aad0fb6b62d (patch) | |
tree | 3ab33a7a92325e48c5297ba9c3f4d8d9c38d3d00 /Lib/test | |
parent | ca0f3d858d069231ce7c5b382790a774f385b467 (diff) | |
download | cpython-e2b3d831fd2824d8a5713e3ed2a64aad0fb6b62d.zip cpython-e2b3d831fd2824d8a5713e3ed2a64aad0fb6b62d.tar.gz cpython-e2b3d831fd2824d8a5713e3ed2a64aad0fb6b62d.tar.bz2 |
gh-109747: Improve errors for unsupported look-behind patterns (GH-109859)
Now re.error is raised instead of OverflowError or RuntimeError for
too large width of look-behind pattern.
The limit is increased to 2**32-1 (was 2**31-1).
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_re.py | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 301d4a5..1eca22f 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1861,6 +1861,29 @@ class ReTests(unittest.TestCase): self.assertRaises(OverflowError, re.compile, r".{%d,}?" % 2**128) self.assertRaises(OverflowError, re.compile, r".{%d,%d}" % (2**129, 2**128)) + def test_look_behind_overflow(self): + string = "x" * 2_500_000 + p1 = r"(?<=((.{%d}){%d}){%d})" + p2 = r"(?<!((.{%d}){%d}){%d})" + # Test that the templates are valid and look-behind with width 2**21 + # (larger than sys.maxunicode) are supported. + self.assertEqual(re.search(p1 % (2**7, 2**7, 2**7), string).span(), + (2**21, 2**21)) + self.assertEqual(re.search(p2 % (2**7, 2**7, 2**7), string).span(), + (0, 0)) + # Test that 2**22 is accepted as a repetition number and look-behind + # width. + re.compile(p1 % (2**22, 1, 1)) + re.compile(p1 % (1, 2**22, 1)) + re.compile(p1 % (1, 1, 2**22)) + re.compile(p2 % (2**22, 1, 1)) + re.compile(p2 % (1, 2**22, 1)) + re.compile(p2 % (1, 1, 2**22)) + # But 2**66 is too large for look-behind width. + errmsg = "looks too much behind" + self.assertRaisesRegex(re.error, errmsg, re.compile, p1 % (2**22, 2**22, 2**22)) + self.assertRaisesRegex(re.error, errmsg, re.compile, p2 % (2**22, 2**22, 2**22)) + def test_backref_group_name_in_exception(self): # Issue 17341: Poor error message when compiling invalid regex self.checkPatternError('(?P=<foo>)', |