88import sys
99import unittest
1010import warnings
11+ from collections .abc import Sequence
1112from re import Scanner
1213from weakref import proxy
1314
@@ -598,40 +599,47 @@ def test_match_getitem(self):
598599 self .assertEqual (m [1 ], 'a' )
599600 self .assertEqual (m [2 ], None )
600601 self .assertEqual (m [3 ], 'c' )
602+ self .assertEqual (m [- 1 ], 'c' )
603+ self .assertEqual (m [- 2 ], None )
604+ self .assertEqual (m [- 3 ], 'a' )
605+ self .assertEqual (m [- 4 ], 'ac' )
601606
602607 # Cannot assign.
603608 with self .assertRaises (TypeError ):
604609 m [0 ] = 1
605610
606- def test_match_sequence (self ):
607- from collections .abc import Sequence
608-
611+ # Slices.
609612 m = re .match (r"(a)(b)(c)" , "abc" )
610- self .assertIsInstance (m , Sequence )
611- self .assertEqual (len (m ), 4 )
612-
613- self .assertEqual (m [0 ], "abc" )
614- self .assertEqual (m [1 ], "a" )
615- self .assertEqual (m [2 ], "b" )
616- self .assertEqual (m [3 ], "c" )
617- with self .assertRaises (IndexError ):
618- _ = m [4 ]
619-
620- self .assertEqual (m [- 1 ], "c" )
621- self .assertEqual (m [- 2 ], "b" )
622- self .assertEqual (m [- 3 ], "a" )
623- self .assertEqual (m [- 4 ], "abc" )
624- with self .assertRaises (IndexError ):
625- _ = m [- 5 ]
626-
613+ self .assertEqual (m [:0 ], ())
614+ self .assertEqual (m [:1 ], ("abc" ,))
615+ self .assertEqual (m [:2 ], ("abc" , "a" ))
616+ self .assertEqual (m [:3 ], ("abc" , "a" , "b" ))
617+ self .assertEqual (m [:4 ], ("abc" , "a" , "b" , "c" ))
618+ self .assertEqual (m [0 :], ("abc" , "a" , "b" , "c" ))
619+ self .assertEqual (m [1 :], ("a" , "b" , "c" ))
620+ self .assertEqual (m [2 :], ("b" , "c" ))
621+ self .assertEqual (m [3 :], ("c" ,))
622+ self .assertEqual (m [4 :], ())
623+ self .assertEqual (m [:- 4 ], ())
624+ self .assertEqual (m [:- 3 ], ("abc" ,))
625+ self .assertEqual (m [:- 2 ], ("abc" , "a" ))
626+ self .assertEqual (m [:- 1 ], ("abc" , "a" , "b" ))
627+ self .assertEqual (m [- 4 :], ("abc" , "a" , "b" , "c" ))
628+ self .assertEqual (m [- 3 :], ("a" , "b" , "c" ))
629+ self .assertEqual (m [- 2 :], ("b" , "c" ))
630+ self .assertEqual (m [- 1 :], ("c" ,))
627631 self .assertEqual (m [1 :- 1 ], ("a" , "b" ))
628632 self .assertEqual (m [::- 1 ], ("c" , "b" , "a" , "abc" ))
633+ self .assertEqual (m [::4 ], ("abc" ,))
634+ self .assertEqual (m [2 :2 ], ())
635+ self .assertEqual (m [3 :1 ], ())
636+ self .assertEqual (m [1 :3 ], ("a" , "b" ))
637+ self .assertEqual (m [- 1 ::- 2 ], ("c" , "a" ))
629638
630- it = iter (m )
631- self .assertEqual (next (it ), "abc" )
632- self .assertEqual (next (it ), "a" )
633- self .assertEqual (next (it ), "b" )
634- self .assertEqual (next (it ), "c" )
639+ def test_match_sequence (self ):
640+ m = re .match (r"(a)(b)(c)" , "abc" )
641+ self .assertIsInstance (m , Sequence )
642+ self .assertEqual (len (m ), 4 )
635643
636644 self .assertEqual (tuple (m ), ("abc" , "a" , "b" , "c" ))
637645 self .assertEqual (list (m ), ["abc" , "a" , "b" , "c" ])
@@ -650,36 +658,97 @@ def test_match_sequence(self):
650658
651659 self .assertEqual (list (reversed (m )), ["c" , "b" , "a" , "abc" ])
652660
661+ for s , k , v in re .finditer (r"(\w+):(\w+)" , "abc:123" ):
662+ self .assertEqual (s , "abc:123" )
663+ self .assertEqual (k , "abc" )
664+ self .assertEqual (v , "123" )
665+
666+ def test_match_iter (self ):
667+ m = re .match (r"(a)(b)(c)" , "abc" )
668+ it = iter (m )
669+ self .assertEqual (next (it ), "abc" )
670+ self .assertEqual (next (it ), "a" )
671+ self .assertEqual (next (it ), "b" )
672+ self .assertEqual (next (it ), "c" )
673+ with self .assertRaises (StopIteration ):
674+ next (it )
675+
676+ def test_match_index (self ):
677+ m = re .match (r"(a)(b)(c)" , "abc" )
653678 self .assertEqual (m .index ("abc" ), 0 )
654679 self .assertEqual (m .index ("a" ), 1 )
655680 self .assertEqual (m .index ("b" ), 2 )
656681 self .assertEqual (m .index ("c" ), 3 )
657682 self .assertRaises (ValueError , m .index , "123" )
658683
684+ # With start index.
685+ self .assertRaises (ValueError , m .index , "abc" , 1 )
686+ self .assertEqual (m .index ("a" , 1 ), 1 )
687+ self .assertEqual (m .index ("b" , 1 ), 2 )
688+ self .assertEqual (m .index ("c" , 1 ), 3 )
689+ self .assertRaises (ValueError , m .index , "123" , 1 )
690+
691+ self .assertRaises (ValueError , m .index , "abc" , 2 )
692+ self .assertRaises (ValueError , m .index , "a" , 2 )
693+ self .assertEqual (m .index ("b" , 2 ), 2 )
694+ self .assertEqual (m .index ("c" , 2 ), 3 )
695+ self .assertRaises (ValueError , m .index , "123" , 2 )
696+
697+ self .assertRaises (ValueError , m .index , "abc" , 3 )
698+ self .assertRaises (ValueError , m .index , "a" , 3 )
699+ self .assertRaises (ValueError , m .index , "b" , 3 )
700+ self .assertEqual (m .index ("c" , 3 ), 3 )
701+ self .assertRaises (ValueError , m .index , "123" , 3 )
702+
703+ self .assertRaises (ValueError , m .index , "abc" , 4 )
704+ self .assertRaises (ValueError , m .index , "a" , 4 )
705+ self .assertRaises (ValueError , m .index , "b" , 4 )
706+ self .assertRaises (ValueError , m .index , "c" , 4 )
707+ self .assertRaises (ValueError , m .index , "123" , 4 )
708+
709+ # With start index and stop index.
710+ self .assertRaises (ValueError , m .index , "b" , 0 , 2 )
711+ self .assertEqual (m .index ("b" , 1 , 3 ), 2 )
712+ self .assertEqual (m .index ("b" , 2 , 4 ), 2 )
713+ self .assertRaises (ValueError , m .index , "b" , 3 , 4 )
714+ self .assertRaises (ValueError , m .index , "b" , - 1 , 0 )
715+
716+ # Non-string objects.
717+ self .assertRaises (ValueError , m .index , 123 )
718+ self .assertRaises (ValueError , m .index , [1 , 2 , 3 ])
719+ self .assertRaises (ValueError , m .index , object ())
720+
721+ def test_match_count (self ):
722+ m = re .match (r"(a)(b)(c)" , "abc" )
659723 self .assertEqual (m .count ("abc" ), 1 )
660724 self .assertEqual (m .count ("a" ), 1 )
661725 self .assertEqual (m .count ("b" ), 1 )
662726 self .assertEqual (m .count ("c" ), 1 )
663727 self .assertEqual (m .count ("123" ), 0 )
664728
729+ # Non-string objects.
730+ self .assertEqual (m .count (123 ), 0 )
731+ self .assertEqual (m .count ([1 , 2 , 3 ]), 0 )
732+ self .assertEqual (m .count (object ()), 0 )
733+
734+ def test_match_match_case (self ):
735+ m = re .match (r"(a)(b)(c)" , "abc" )
736+
665737 match m :
666- case [_ , "a" , "b" , "c" ]:
667- pass
738+ case [abc , "a" , "b" , "c" ]:
739+ self . assertEqual ( abc , "abc" )
668740 case _:
669741 self .fail ()
670742
671743 match re .match (r"(\d+)-(\d+)-(\d+)" , "2025-05-07" ):
672- case [_, year , month , day ]:
744+ case [date , year , month , day ]:
745+ self .assertEqual (date , "2025-05-07" )
673746 self .assertEqual (year , "2025" )
674747 self .assertEqual (month , "05" )
675748 self .assertEqual (day , "07" )
676749 case _:
677750 self .fail ()
678751
679- for s , k , v in re .finditer (r"(\w+):(\w+)" , "abc:123" ):
680- self .assertEqual (s , "abc:123" )
681- self .assertEqual (k , "abc" )
682- self .assertEqual (v , "123" )
683752
684753 def test_re_fullmatch (self ):
685754 # Issue 16203: Proposal: add re.fullmatch() method.
0 commit comments