@@ -83,6 +83,48 @@ def test_bug_449000(self):
8383 self .assertEqual (re .sub ('\r \n ' , '\n ' , 'abc\r \n def\r \n ' ),
8484 'abc\n def\n ' )
8585
86+ def test_sub_template_numeric_escape (self ):
87+ # bug 776311 and friends
88+ self .assertEqual (re .sub ('x' , r'\0' , 'x' ), '\0 ' )
89+ self .assertEqual (re .sub ('x' , r'\000' , 'x' ), '\000 ' )
90+ self .assertEqual (re .sub ('x' , r'\001' , 'x' ), '\001 ' )
91+ self .assertEqual (re .sub ('x' , r'\008' , 'x' ), '\0 ' + '8' )
92+ self .assertEqual (re .sub ('x' , r'\009' , 'x' ), '\0 ' + '9' )
93+ self .assertEqual (re .sub ('x' , r'\111' , 'x' ), '\111 ' )
94+ self .assertEqual (re .sub ('x' , r'\117' , 'x' ), '\117 ' )
95+
96+ self .assertEqual (re .sub ('x' , r'\1111' , 'x' ), '\111 1' )
97+ self .assertEqual (re .sub ('x' , r'\1111' , 'x' ), '\111 ' + '1' )
98+
99+ self .assertEqual (re .sub ('x' , r'\00' , 'x' ), '\x00 ' )
100+ self .assertEqual (re .sub ('x' , r'\07' , 'x' ), '\x07 ' )
101+ self .assertEqual (re .sub ('x' , r'\08' , 'x' ), '\0 ' + '8' )
102+ self .assertEqual (re .sub ('x' , r'\09' , 'x' ), '\0 ' + '9' )
103+ self .assertEqual (re .sub ('x' , r'\0a' , 'x' ), '\0 ' + 'a' )
104+
105+ self .assertEqual (re .sub ('x' , r'\400' , 'x' ), '\0 ' )
106+ self .assertEqual (re .sub ('x' , r'\777' , 'x' ), '\377 ' )
107+
108+ self .assertRaises (re .error , re .sub , 'x' , r'\1' , 'x' )
109+ self .assertRaises (re .error , re .sub , 'x' , r'\8' , 'x' )
110+ self .assertRaises (re .error , re .sub , 'x' , r'\9' , 'x' )
111+ self .assertRaises (re .error , re .sub , 'x' , r'\11' , 'x' )
112+ self .assertRaises (re .error , re .sub , 'x' , r'\18' , 'x' )
113+ self .assertRaises (re .error , re .sub , 'x' , r'\1a' , 'x' )
114+ self .assertRaises (re .error , re .sub , 'x' , r'\90' , 'x' )
115+ self .assertRaises (re .error , re .sub , 'x' , r'\99' , 'x' )
116+ self .assertRaises (re .error , re .sub , 'x' , r'\118' , 'x' ) # r'\11' + '8'
117+ self .assertRaises (re .error , re .sub , 'x' , r'\11a' , 'x' )
118+ self .assertRaises (re .error , re .sub , 'x' , r'\181' , 'x' ) # r'\18' + '1'
119+ self .assertRaises (re .error , re .sub , 'x' , r'\800' , 'x' ) # r'\80' + '0'
120+
121+ # in python2.3 (etc), these loop endlessly in sre_parser.py
122+ self .assertEqual (re .sub ('(((((((((((x)))))))))))' , r'\11' , 'x' ), 'x' )
123+ self .assertEqual (re .sub ('((((((((((y))))))))))(.)' , r'\118' , 'xyz' ),
124+ 'xz8' )
125+ self .assertEqual (re .sub ('((((((((((y))))))))))(.)' , r'\11a' , 'xyz' ),
126+ 'xza' )
127+
86128 def test_qualified_re_sub (self ):
87129 self .assertEqual (re .sub ('a' , 'b' , 'aaaaa' ), 'bbbbb' )
88130 self .assertEqual (re .sub ('a' , 'b' , 'aaaaa' , 1 ), 'baaaa' )
@@ -105,6 +147,7 @@ def test_symbolic_refs(self):
105147 self .assertRaises (IndexError , re .sub , '(?P<a>x)' , '\g<ab>' , 'xx' )
106148 self .assertRaises (re .error , re .sub , '(?P<a>x)|(?P<b>y)' , '\g<b>' , 'xx' )
107149 self .assertRaises (re .error , re .sub , '(?P<a>x)|(?P<b>y)' , '\\ 2' , 'xx' )
150+ self .assertRaises (re .error , re .sub , '(?P<a>x)' , '\g<-1>' , 'xx' )
108151
109152 def test_re_subn (self ):
110153 self .assertEqual (re .subn ("(?i)b+" , "x" , "bbbb BBBB" ), ('x x' , 2 ))
@@ -386,6 +429,16 @@ def test_sre_character_literals(self):
386429 self .assertNotEqual (re .match (r"\x%02xz" % i , chr (i )+ "z" ), None )
387430 self .assertRaises (re .error , re .match , "\911 " , "" )
388431
432+ def test_sre_character_class_literals (self ):
433+ for i in [0 , 8 , 16 , 32 , 64 , 127 , 128 , 255 ]:
434+ self .assertNotEqual (re .match (r"[\%03o]" % i , chr (i )), None )
435+ self .assertNotEqual (re .match (r"[\%03o0]" % i , chr (i )), None )
436+ self .assertNotEqual (re .match (r"[\%03o8]" % i , chr (i )), None )
437+ self .assertNotEqual (re .match (r"[\x%02x]" % i , chr (i )), None )
438+ self .assertNotEqual (re .match (r"[\x%02x0]" % i , chr (i )), None )
439+ self .assertNotEqual (re .match (r"[\x%02xz]" % i , chr (i )), None )
440+ self .assertRaises (re .error , re .match , "[\911 ]" , "" )
441+
389442 def test_bug_113254 (self ):
390443 self .assertEqual (re .match (r'(a)|(b)' , 'b' ).start (1 ), - 1 )
391444 self .assertEqual (re .match (r'(a)|(b)' , 'b' ).end (1 ), - 1 )
0 commit comments