8
8
import sys
9
9
import unittest
10
10
import warnings
11
+ from collections .abc import Sequence
11
12
from re import Scanner
12
13
from weakref import proxy
13
14
@@ -598,40 +599,47 @@ def test_match_getitem(self):
598
599
self .assertEqual (m [1 ], 'a' )
599
600
self .assertEqual (m [2 ], None )
600
601
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' )
601
606
602
607
# Cannot assign.
603
608
with self .assertRaises (TypeError ):
604
609
m [0 ] = 1
605
610
606
- def test_match_sequence (self ):
607
- from collections .abc import Sequence
608
-
611
+ # Slices.
609
612
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" ,))
627
631
self .assertEqual (m [1 :- 1 ], ("a" , "b" ))
628
632
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" ))
629
638
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 )
635
643
636
644
self .assertEqual (tuple (m ), ("abc" , "a" , "b" , "c" ))
637
645
self .assertEqual (list (m ), ["abc" , "a" , "b" , "c" ])
@@ -650,36 +658,97 @@ def test_match_sequence(self):
650
658
651
659
self .assertEqual (list (reversed (m )), ["c" , "b" , "a" , "abc" ])
652
660
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" )
653
678
self .assertEqual (m .index ("abc" ), 0 )
654
679
self .assertEqual (m .index ("a" ), 1 )
655
680
self .assertEqual (m .index ("b" ), 2 )
656
681
self .assertEqual (m .index ("c" ), 3 )
657
682
self .assertRaises (ValueError , m .index , "123" )
658
683
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" )
659
723
self .assertEqual (m .count ("abc" ), 1 )
660
724
self .assertEqual (m .count ("a" ), 1 )
661
725
self .assertEqual (m .count ("b" ), 1 )
662
726
self .assertEqual (m .count ("c" ), 1 )
663
727
self .assertEqual (m .count ("123" ), 0 )
664
728
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
+
665
737
match m :
666
- case [_ , "a" , "b" , "c" ]:
667
- pass
738
+ case [abc , "a" , "b" , "c" ]:
739
+ self . assertEqual ( abc , "abc" )
668
740
case _:
669
741
self .fail ()
670
742
671
743
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" )
673
746
self .assertEqual (year , "2025" )
674
747
self .assertEqual (month , "05" )
675
748
self .assertEqual (day , "07" )
676
749
case _:
677
750
self .fail ()
678
751
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" )
683
752
684
753
def test_re_fullmatch (self ):
685
754
# Issue 16203: Proposal: add re.fullmatch() method.
0 commit comments