diff -r da2c96cf2ce6 Lib/re.py --- a/Lib/re.py Sun Sep 25 20:39:29 2016 +0300 +++ b/Lib/re.py Sun Sep 25 20:50:41 2016 +0300 @@ -188,6 +188,8 @@ def sub(pattern, repl, string, count=0, if a string, backslash escapes in it are processed. If it is a callable, it's passed the match object and must return a replacement string to be used.""" + if isinstance(count, RegexFlag): + raise TypeError("flags argument is used as count") return _compile(pattern, flags).sub(repl, string, count) def subn(pattern, repl, string, count=0, flags=0): @@ -199,6 +201,8 @@ def subn(pattern, repl, string, count=0, callable; if a string, backslash escapes in it are processed. If it is a callable, it's passed the match object and must return a replacement string to be used.""" + if isinstance(count, RegexFlag): + raise TypeError("flags argument is used as count") return _compile(pattern, flags).subn(repl, string, count) def split(pattern, string, maxsplit=0, flags=0): @@ -209,6 +213,8 @@ def split(pattern, string, maxsplit=0, f list. If maxsplit is nonzero, at most maxsplit splits occur, and the remainder of the string is returned as the final element of the list.""" + if isinstance(maxsplit, RegexFlag): + raise TypeError("flags argument is used as maxsplit") return _compile(pattern, flags).split(string, maxsplit) def findall(pattern, string, flags=0): diff -r da2c96cf2ce6 Lib/test/test_re.py --- a/Lib/test/test_re.py Sun Sep 25 20:39:29 2016 +0300 +++ b/Lib/test/test_re.py Sun Sep 25 20:50:41 2016 +0300 @@ -211,6 +211,11 @@ class ReTests(unittest.TestCase): self.assertEqual(re.sub('a', 'b', 'aaaaa', 1), 'baaaa') self.assertEqual(re.sub('a', 'b', 'aaaaa', count=1), 'baaaa') + def test_misuse_flags(self): + self.assertRaises(TypeError, re.sub, 'a', 'b', 'aaaaa', re.I) + self.assertRaises(TypeError, re.subn, "b*", "x", "xyz", re.I) + self.assertRaises(TypeError, re.split, ":", ":a:b::c", re.I) + def test_bug_114660(self): self.assertEqual(re.sub(r'(\S)\s+(\S)', r'\1 \2', 'hello there'), 'hello there')