mirror of
https://github.com/python/cpython.git
synced 2025-08-15 22:30:42 +00:00
[3.9] gh-91575: Update case-insensitive matching in re to the latest Unicode version (GH-91580). (GH-91661) (GH-91837)
(cherry picked from commit1c2fcebf3c
) (cherry picked from commit1748816e80
) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
76ff68666f
commit
537dabc869
3 changed files with 78 additions and 9 deletions
|
@ -872,16 +872,30 @@ class ReTests(unittest.TestCase):
|
|||
self.assertEqual(re.match(r"((a)\s(abc|a))", "a a", re.I).group(1), "a a")
|
||||
self.assertEqual(re.match(r"((a)\s(abc|a)*)", "a aa", re.I).group(1), "a aa")
|
||||
|
||||
assert '\u212a'.lower() == 'k' # 'K'
|
||||
# Two different characters have the same lowercase.
|
||||
assert 'K'.lower() == '\u212a'.lower() == 'k' # 'K'
|
||||
self.assertTrue(re.match(r'K', '\u212a', re.I))
|
||||
self.assertTrue(re.match(r'k', '\u212a', re.I))
|
||||
self.assertTrue(re.match(r'\u212a', 'K', re.I))
|
||||
self.assertTrue(re.match(r'\u212a', 'k', re.I))
|
||||
assert '\u017f'.upper() == 'S' # 'ſ'
|
||||
|
||||
# Two different characters have the same uppercase.
|
||||
assert 's'.upper() == '\u017f'.upper() == 'S' # 'ſ'
|
||||
self.assertTrue(re.match(r'S', '\u017f', re.I))
|
||||
self.assertTrue(re.match(r's', '\u017f', re.I))
|
||||
self.assertTrue(re.match(r'\u017f', 'S', re.I))
|
||||
self.assertTrue(re.match(r'\u017f', 's', re.I))
|
||||
|
||||
# Two different characters have the same uppercase. Unicode 9.0+.
|
||||
assert '\u0432'.upper() == '\u1c80'.upper() == '\u0412' # 'в', 'ᲀ', 'В'
|
||||
self.assertTrue(re.match(r'\u0412', '\u0432', re.I))
|
||||
self.assertTrue(re.match(r'\u0412', '\u1c80', re.I))
|
||||
self.assertTrue(re.match(r'\u0432', '\u0412', re.I))
|
||||
self.assertTrue(re.match(r'\u0432', '\u1c80', re.I))
|
||||
self.assertTrue(re.match(r'\u1c80', '\u0412', re.I))
|
||||
self.assertTrue(re.match(r'\u1c80', '\u0432', re.I))
|
||||
|
||||
# Two different characters have the same multicharacter uppercase.
|
||||
assert '\ufb05'.upper() == '\ufb06'.upper() == 'ST' # 'ſt', 'st'
|
||||
self.assertTrue(re.match(r'\ufb05', '\ufb06', re.I))
|
||||
self.assertTrue(re.match(r'\ufb06', '\ufb05', re.I))
|
||||
|
@ -895,16 +909,31 @@ class ReTests(unittest.TestCase):
|
|||
self.assertTrue(re.match(br'[19a]', b'a', re.I))
|
||||
self.assertTrue(re.match(br'[19a]', b'A', re.I))
|
||||
self.assertTrue(re.match(br'[19A]', b'a', re.I))
|
||||
assert '\u212a'.lower() == 'k' # 'K'
|
||||
|
||||
# Two different characters have the same lowercase.
|
||||
assert 'K'.lower() == '\u212a'.lower() == 'k' # 'K'
|
||||
self.assertTrue(re.match(r'[19K]', '\u212a', re.I))
|
||||
self.assertTrue(re.match(r'[19k]', '\u212a', re.I))
|
||||
self.assertTrue(re.match(r'[19\u212a]', 'K', re.I))
|
||||
self.assertTrue(re.match(r'[19\u212a]', 'k', re.I))
|
||||
assert '\u017f'.upper() == 'S' # 'ſ'
|
||||
|
||||
# Two different characters have the same uppercase.
|
||||
assert 's'.upper() == '\u017f'.upper() == 'S' # 'ſ'
|
||||
self.assertTrue(re.match(r'[19S]', '\u017f', re.I))
|
||||
self.assertTrue(re.match(r'[19s]', '\u017f', re.I))
|
||||
self.assertTrue(re.match(r'[19\u017f]', 'S', re.I))
|
||||
self.assertTrue(re.match(r'[19\u017f]', 's', re.I))
|
||||
|
||||
# Two different characters have the same uppercase. Unicode 9.0+.
|
||||
assert '\u0432'.upper() == '\u1c80'.upper() == '\u0412' # 'в', 'ᲀ', 'В'
|
||||
self.assertTrue(re.match(r'[19\u0412]', '\u0432', re.I))
|
||||
self.assertTrue(re.match(r'[19\u0412]', '\u1c80', re.I))
|
||||
self.assertTrue(re.match(r'[19\u0432]', '\u0412', re.I))
|
||||
self.assertTrue(re.match(r'[19\u0432]', '\u1c80', re.I))
|
||||
self.assertTrue(re.match(r'[19\u1c80]', '\u0412', re.I))
|
||||
self.assertTrue(re.match(r'[19\u1c80]', '\u0432', re.I))
|
||||
|
||||
# Two different characters have the same multicharacter uppercase.
|
||||
assert '\ufb05'.upper() == '\ufb06'.upper() == 'ST' # 'ſt', 'st'
|
||||
self.assertTrue(re.match(r'[19\ufb05]', '\ufb06', re.I))
|
||||
self.assertTrue(re.match(r'[19\ufb06]', '\ufb05', re.I))
|
||||
|
@ -928,16 +957,30 @@ class ReTests(unittest.TestCase):
|
|||
self.assertTrue(re.match(r'[\U00010400-\U00010427]', '\U00010428', re.I))
|
||||
self.assertTrue(re.match(r'[\U00010400-\U00010427]', '\U00010400', re.I))
|
||||
|
||||
assert '\u212a'.lower() == 'k' # 'K'
|
||||
# Two different characters have the same lowercase.
|
||||
assert 'K'.lower() == '\u212a'.lower() == 'k' # 'K'
|
||||
self.assertTrue(re.match(r'[J-M]', '\u212a', re.I))
|
||||
self.assertTrue(re.match(r'[j-m]', '\u212a', re.I))
|
||||
self.assertTrue(re.match(r'[\u2129-\u212b]', 'K', re.I))
|
||||
self.assertTrue(re.match(r'[\u2129-\u212b]', 'k', re.I))
|
||||
assert '\u017f'.upper() == 'S' # 'ſ'
|
||||
|
||||
# Two different characters have the same uppercase.
|
||||
assert 's'.upper() == '\u017f'.upper() == 'S' # 'ſ'
|
||||
self.assertTrue(re.match(r'[R-T]', '\u017f', re.I))
|
||||
self.assertTrue(re.match(r'[r-t]', '\u017f', re.I))
|
||||
self.assertTrue(re.match(r'[\u017e-\u0180]', 'S', re.I))
|
||||
self.assertTrue(re.match(r'[\u017e-\u0180]', 's', re.I))
|
||||
|
||||
# Two different characters have the same uppercase. Unicode 9.0+.
|
||||
assert '\u0432'.upper() == '\u1c80'.upper() == '\u0412' # 'в', 'ᲀ', 'В'
|
||||
self.assertTrue(re.match(r'[\u0411-\u0413]', '\u0432', re.I))
|
||||
self.assertTrue(re.match(r'[\u0411-\u0413]', '\u1c80', re.I))
|
||||
self.assertTrue(re.match(r'[\u0431-\u0433]', '\u0412', re.I))
|
||||
self.assertTrue(re.match(r'[\u0431-\u0433]', '\u1c80', re.I))
|
||||
self.assertTrue(re.match(r'[\u1c80-\u1c82]', '\u0412', re.I))
|
||||
self.assertTrue(re.match(r'[\u1c80-\u1c82]', '\u0432', re.I))
|
||||
|
||||
# Two different characters have the same multicharacter uppercase.
|
||||
assert '\ufb05'.upper() == '\ufb06'.upper() == 'ST' # 'ſt', 'st'
|
||||
self.assertTrue(re.match(r'[\ufb04-\ufb05]', '\ufb06', re.I))
|
||||
self.assertTrue(re.match(r'[\ufb06-\ufb07]', '\ufb05', re.I))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue