@@ -557,7 +557,7 @@ def test_anyall(self):
557557 self .assertEqual (re .match ("a.*b" , "a\n \n b" , re .DOTALL ).group (0 ),
558558 "a\n \n b" )
559559
560- def test_non_consuming (self ):
560+ def test_lookahead (self ):
561561 self .assertEqual (re .match ("(a(?=\s[^a]))" , "a b" ).group (1 ), "a" )
562562 self .assertEqual (re .match ("(a(?=\s[^a]*))" , "a b" ).group (1 ), "a" )
563563 self .assertEqual (re .match ("(a(?=\s[abc]))" , "a b" ).group (1 ), "a" )
@@ -571,6 +571,37 @@ def test_non_consuming(self):
571571 self .assertEqual (re .match (r"(a)(?!\s\1)" , "a b" ).group (1 ), "a" )
572572 self .assertEqual (re .match (r"(a)(?!\s(abc|a))" , "a b" ).group (1 ), "a" )
573573
574+ # Group reference.
575+ self .assertTrue (re .match (r'(a)b(?=\1)a' , 'aba' ))
576+ self .assertIsNone (re .match (r'(a)b(?=\1)c' , 'abac' ))
577+ # Named group reference.
578+ self .assertTrue (re .match (r'(?P<g>a)b(?=(?P=g))a' , 'aba' ))
579+ self .assertIsNone (re .match (r'(?P<g>a)b(?=(?P=g))c' , 'abac' ))
580+ # Conditional group reference.
581+ self .assertTrue (re .match (r'(?:(a)|(x))b(?=(?(2)x|c))c' , 'abc' ))
582+ self .assertIsNone (re .match (r'(?:(a)|(x))b(?=(?(2)c|x))c' , 'abc' ))
583+ self .assertTrue (re .match (r'(?:(a)|(x))b(?=(?(2)x|c))c' , 'abc' ))
584+ self .assertIsNone (re .match (r'(?:(a)|(x))b(?=(?(1)b|x))c' , 'abc' ))
585+ self .assertTrue (re .match (r'(?:(a)|(x))b(?=(?(1)c|x))c' , 'abc' ))
586+ # Group used before defined.
587+ self .assertTrue (re .match (r'(a)b(?=(?(2)x|c))(c)' , 'abc' ))
588+ self .assertIsNone (re .match (r'(a)b(?=(?(2)b|x))(c)' , 'abc' ))
589+ self .assertTrue (re .match (r'(a)b(?=(?(1)c|x))(c)' , 'abc' ))
590+
591+ def test_lookbehind (self ):
592+ self .assertTrue (re .match (r'ab(?<=b)c' , 'abc' ))
593+ self .assertIsNone (re .match (r'ab(?<=c)c' , 'abc' ))
594+ self .assertIsNone (re .match (r'ab(?<!b)c' , 'abc' ))
595+ self .assertTrue (re .match (r'ab(?<!c)c' , 'abc' ))
596+ # Group reference.
597+ self .assertWarns (RuntimeWarning , re .compile , r'(a)a(?<=\1)c' )
598+ # Named group reference.
599+ self .assertWarns (RuntimeWarning , re .compile , r'(?P<g>a)a(?<=(?P=g))c' )
600+ # Conditional group reference.
601+ self .assertWarns (RuntimeWarning , re .compile , r'(a)b(?<=(?(1)b|x))c' )
602+ # Group used before defined.
603+ self .assertWarns (RuntimeWarning , re .compile , r'(a)b(?<=(?(2)b|x))(c)' )
604+
574605 def test_ignore_case (self ):
575606 self .assertEqual (re .match ("abc" , "ABC" , re .I ).group (0 ), "ABC" )
576607 self .assertEqual (re .match (b"abc" , b"ABC" , re .I ).group (0 ), b"ABC" )
0 commit comments