summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-10-14 06:13:02 (GMT)
committerGitHub <noreply@github.com>2023-10-14 06:13:02 (GMT)
commite2b3d831fd2824d8a5713e3ed2a64aad0fb6b62d (patch)
tree3ab33a7a92325e48c5297ba9c3f4d8d9c38d3d00 /Lib/test
parentca0f3d858d069231ce7c5b382790a774f385b467 (diff)
downloadcpython-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.py23
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>)',