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,99 @@ 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 ,b"123" )
719
+ self .assertRaises (ValueError ,m .index , [1 ,2 ,3 ])
720
+ self .assertRaises (ValueError ,m .index ,object ())
721
+
722
+ def test_match_count (self ):
723
+ m = re .match (r"(a)(b)(c)" ,"abc" )
659
724
self .assertEqual (m .count ("abc" ),1 )
660
725
self .assertEqual (m .count ("a" ),1 )
661
726
self .assertEqual (m .count ("b" ),1 )
662
727
self .assertEqual (m .count ("c" ),1 )
663
728
self .assertEqual (m .count ("123" ),0 )
664
729
730
+ # Non-string objects.
731
+ self .assertEqual (m .count (123 ),0 )
732
+ self .assertEqual (m .count (b"123" ),0 )
733
+ self .assertEqual (m .count ([1 ,2 ,3 ]),0 )
734
+ self .assertEqual (m .count (object ()),0 )
735
+
736
+ def test_match_match_case (self ):
737
+ m = re .match (r"(a)(b)(c)" ,"abc" )
738
+
665
739
match m :
666
- case [_ ,"a" ,"b" ,"c" ]:
667
- pass
740
+ case [abc ,"a" ,"b" ,"c" ]:
741
+ self . assertEqual ( abc , "abc" )
668
742
case _:
669
743
self .fail ()
670
744
671
745
match re .match (r"(\d+)-(\d+)-(\d+)" ,"2025-05-07" ):
672
- case [_,year ,month ,day ]:
746
+ case [date ,year ,month ,day ]:
747
+ self .assertEqual (date ,"2025-05-07" )
673
748
self .assertEqual (year ,"2025" )
674
749
self .assertEqual (month ,"05" )
675
750
self .assertEqual (day ,"07" )
676
751
case _:
677
752
self .fail ()
678
753
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
754
684
755
def test_re_fullmatch (self ):
685
756
# Issue 16203: Proposal: add re.fullmatch() method.